iteye_19402
2011-05-24 22:01
浏览 246
已采纳

关于线程中volatile的一点疑惑

我在学习线程时,了解volatile解决的是可见性问题。但是在某些地方,看到如下的例子:
[code="java"]class Counter {

private volatile int count = 0;

public synchronized void increment() {
    count++;
}

public int get() {
    return count;
}

}
[/code]
这个类被认为是线程安全的(见[url=http://www.ibm.com/developerworks/cn/java/j-jtp06197.html]链接[/url]中的最后一个例子),但get没有加synchronized标识,那么我就产生了一个疑惑:
为什么它是线程安全的?
count是任何时刻都可见的,而count++不是原子性的,那么count的值就可能count++的中间状态.而且get()方法不需要得到对象锁,那么执行get()方法,没有可能得到count++的中间状态么?

以下例子又显然是线程不安全的:
[code="java"]
class Counter {

private volatile int count = 0;

public synchronized void increment() {
    count++;
    //something.else..
    count++;
}

public int get() {
    return count;
}

}
[/code]
那么两者的区别又是在哪里呢??好纠结啊...望高手能帮我解释一下。 :cry:

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题