【发布时间】:2015-07-18 11:17:37
【问题描述】:
我知道 volatile 关键字会刷新所有不可见数据,即,如果某个线程读取 volatile 变量,所有潜在的不可见变量/引用(不仅是要读取的变量)在之后都会正常(可见,即具有正确的值)这个阅读。正确的?但是同步呢?是一样的吗?例如,如果在同步块中我们读取 3 个变量,那么所有其他变量都会可见吗?
如果一个线程从非同步块中更改某个变量的值(例如将变量“年龄”从 2 设置为 33)并且在该线程死亡之后会发生什么?值可以写入线程栈,但是主线程可能看不到这个变化,后台线程会死掉,新的值没有了,无法取回?
1234563并且在那之后将继续,我们如何确保所有变量更改(由后台线程进行)将对主线程可见?我们可以在后台线程完成后放置同步块还是?我们不想每次在线程死后都使用同步块访问从后台线程更改的变量(因为它是开销),但是我们需要它们的正确值?但是读取一些假的 volatile 变量或使用假的同步块(如果它刷新所有数据)只是为了刷新所有数据是不自然的。
我希望我的问题得到很好的解释。 提前致谢。
【问题讨论】:
标签: java multithreading concurrency synchronized volatile