【发布时间】:2012-07-25 17:59:30
【问题描述】:
使用同步时会影响性能。 volatile 可以与 synchronized 结合使用以减少性能开销吗?例如,Counter 的实例将在多个线程之间共享,并且每个线程都可以访问 Counter 的公共方法。在下面的代码中,volatile 用于 getter,synchronized 用于 setter
public class Counter
{
private volatile int count;
public Counter()
{
count = 0;
}
public int getCount()
{
return count;
}
public synchronized void increment()
{
++count;
}
}
请让我知道这可能会在哪种情况下中断?
【问题讨论】:
-
我会说不。因为这两者没有关系(以你似乎认为的方式)。另外,在你的代码中,当你进入方法时,你已经准备好获得监视器锁了。
-
是的,setter 获得了锁,但 getter 没有获得。
-
但是你没有在getter中修改count,这只确保每次都检查值而不是缓存
-
在这种情况下它会起作用,但是如果您的同步写入方法正在对状态执行多个操作,使得状态得到更新但在此类操作期间不一致,那么这将不起作用。例如。如果您在 increment() 中执行了两次 count++,getCount() 可能会返回第一个增量,然后在后续调用中返回下一个增量,这可能不适合您的业务逻辑。
标签: java concurrency volatile synchronized