Vấn đề về đồng bộ hóa trong java?

Chào mọi người, em đang làm bài tập về đồng bộ hóa trong java.
Đề bài yêu cầu: Viết chương trình tạo ra đối tượng đọc tập tin, viết tập tin chạy ở từng tiến trình
riêng (có xử lý đồng bộ hóa dư liệu).
Vậy ở đây phải tạo ra 2 class đọc và viết tập tin riêng đúng không ạ?
Và làm thế nào để trong một thời điểm chỉ có thể đọc hoặc ghi trên một file ạ?

ở đây em tạo 2 class như sau:

class FileTWrite để ghi tập tin:

// FileTWriter.java
package lab5;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class FileTWrite implements Runnable {
    private String fileName;
    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public FileTWrite(String fileName) {
        this.fileName = fileName;
    }
    // Viết dãy số ngẫu nhiên vào file
    @Override
    public void run() {
        try {
            FileWriter fw = new FileWriter(new File(this.getFileName()));
            BufferedWriter bw = new BufferedWriter(fw);
            for(int i = 0 ; i < 100; i++){
                int rand = (int) (Math.random() * 100);
                bw.write(rand + "\t");
            }
            bw.close();
            fw.close();
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        Thread t1 = new Thread(new FileTWrite("test1.txt"));
        Thread t2 = new Thread(new FileTWrite("test2.txt"));
        Thread t3 = new Thread(new FileTWrite("test3.txt"));
        
        t1.start();
        t2.start();
        t3.start();
        
        System.out.println("Done!");
    }
}

class FileTReader để đọc

// FileTReader.java
package lab5;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class FileTReader implements Runnable {
    String fileName;
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public FileTReader(String fileName) {
        this.fileName = fileName;
    }
    @Override
    public void run() {
        try {
            FileReader fr = new FileReader(new File(this.getFileName()));
            BufferedReader br = new BufferedReader(fr);
            int c;
            while((c = br.read()) != -1) {
                System.out.println(this.getFileName() + ": " + c);
            }
            br.close();
            fr.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Thread t1 = new Thread(new FileTReader("test1.txt"));
        Thread t2 = new Thread(new FileTReader("test2.txt"));
        Thread t3 = new Thread(new FileTReader("test3.txt"));
        
        t1.start();
        t2.start();
        t3.start();
    }
}

Giờ em tạo đối tượng ghi file test.txt trước, rồi đọc file test.txt đó bằng FileTReader nhưng lại ko ra kết quả ạ

class Test:

package test;

import lab5.FileTReader;
import lab5.FileTWrite;

public class Test {

    public static void main(String[] args) {
        FileTWrite ftw = new FileTWrite("test.txt");
        Thread t1 = new Thread(ftw);
        
        FileTReader fwr = new FileTReader("test.txt");
        Thread t2 = new Thread(fwr);
        
        t1.start();
        
        t2.start();
    }

}


Em đã thêm synchronized vào hàm run() của cả 2 class mà vẫn không được.
Ai giải thích cho em cái cơ chế đồng bộ này với ạ. Em cám ơn.

1 Like

chưa ghi xong đã read thì làm gì có dữ liệu cho mà đọc. synchronized thif phải synchronized shared memory chứ, ở đây làm gì có đối tượng chung đâu mà synchronized

1 Like

Bây giờ để đồng bộ quá trình đọc ghi trên cùng 1 file thì làm như thế nào ạ?

ghi xong rồi thì mới khởi động thread đọc thôi

Bây giờ để cho 2 thread đọc và ghi chạy đồng thời thì có được không ạ?
Theo yêu câu của đề bài này ạ: Viết
hàm main tạo ra đối tượng viết và đọc dữ liệu với tập tin giống nhau. Kiểm tra
việc đồng bộ hóa dữ liệu.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?