关于线程中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:

synchronized的increment方法保证了对count的修改是同步的,而get方法无需同步,因为读取不涉及到修改数据;lz只看到了volatile而忽视了synchronized的存在,可以这样认为:volatile的功能只是synchronized功能的一个子集,一个线程的increment方法不执行完,其他线程是没法访问的