【发布时间】:2018-09-23 11:53:28
【问题描述】:
我正在阅读有关 java 中的同步和易失性的信息。每一篇新文章都让我感到困惑。一篇文章说“Java 的 synchronized 关键字保证了互斥和可见性”。我不确定可见性部分。 java中的volatile是否解决了可见性问题。让我们考虑这个小程序。
class SharedObj
{
volatile int sharedVar = 6;
public int synchronized getVar(){
return sharedVar;
}
public synchronized setVar(int i){
return sharedVar=i;
}
}
假设这是由 10 个线程运行的,5 个用于读取,5 个用于写入同一 SharedObj 对象。 这里我们既需要同步也需要 volatile?
volatile :因为每个线程都会将 sharedVar 缓存到本地缓存中。
同步:一次一个线程。
【问题讨论】:
-
如果方法是
synchronized,并且该方法包含20000个变量,您是否希望它们都被标记为volatile? -
@Thomas .. 我的困惑是关于实例变量(例如 sharedVar)而不是局部变量。
-
据我在 cmets 中发布的线程了解,
volative可以省略sharedVar -
@Maxim 是的,通过同步
getter和setter并使sharedVar私有,您可以使SharedObj类线程安全,并且可以安全地省略volatile。
标签: java synchronized volatile