wait()期间的非易失性变量值和两个线程中的notifyall()调用

anu*_*har 3 java multithreading volatile synchronized

假设我有两个线程A和B,并且在这两个线程中我都有synchronized块,其中一个int变量被连续修改.例如,thread A输入synchronized block modify int variable然后调用这两个方法:

notifyall(); //to wake thread B which is in waiting state and
wait(): 
Run Code Online (Sandbox Code Playgroud)

然后thread B获取锁定并执行与线程A相同的步骤,并继续重复进程.对int变量的所有更改都发生在两个线程的synchronized块中.

我的问题是我需要制作int变量volatile.在进入等待状态之前,将线程刷新到主存储器,并在线程因notifyall();调用而再次锁定时重新加载寄存器中的数据.

Joh*_*ger 5

如果A和B交替运行,而不是并行的,如果他们通过关闭wait()notifyAll()调用同一Object的,如果没有其他的线程问题访问变量,那么线程安全不需要变量挥发.

需要注意的是o.wait()o.notifyAll()上必须是同步的方法或块内被调用o-该同步是足以确保两个线程看到所有对方的关断之前写入的任何变量.

请注意确保两个线程在同一对象上同步,这在您的问题中是不明确的.如果两个线程正在等待并通知同一个类的不同实例,则根本没有有效的同步.