package thead.safe.safe5;

// 在多线程编程中，synchronized 关键字可以确保一个线程在执行某个方法时，其他线程无法同时访问被同步的方法，从而避免多个线程同时修改共享数据的问题。
// 脏读（Dirty Read）指的是一个线程读取到另一个线程还未提交的修改数据，这种数据在另一个线程最终提交或者回滚后可能会发生变化，因此是不可靠的。
public class DirtyReadExample {

    private Integer sharedValue = 0;  // 共享变量

    // 假设我们有一个多线程程序，其中多个线程同时对共享变量进行操作，未对共享变量进行适当的同步，就可能会发生脏读。
    // 例如，线程 A 读取了线程 B 未提交的修改，或者线程 B 在 A 修改时正在读取数据，导致读取到的数据不一致。
    public static void main(String[] args) {
        DirtyReadExample example = new DirtyReadExample();
        Thread threadA = new Thread(example::threadA);
        Thread threadB = new Thread(example::threadB);

        threadA.start();
        threadB.start();
    }

    // 线程A方法：修改共享变量
    synchronized public void threadA() {
        sharedValue = 100;
        System.out.println("ThreadA 修改 sharedValue 为: " + sharedValue);
        try {
            Thread.sleep(2000);  // 模拟长时间操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        sharedValue = 200;
        System.out.println("ThreadA 修改 sharedValue 为: " + sharedValue);
    }

    // 线程B方法：读取共享变量
    synchronized public void threadB() {
        try {
            Thread.sleep(1000);  // 确保线程A先运行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("ThreadB 读取 sharedValue: " + sharedValue);  // 读取共享变量
    }
}
