线程安全困惑

看了线程并发的部分内容, :x , 发现自己晕了。哈哈,别喷,帮忙看下下面这个类是线程安全的吗?能不能解释下。 谢谢!!!

[code="java"]
public class Demo {
private volatile int x;

public int getX() {
    return x;
}

public void setX(int x) {
    this.x = x;
}

}
[/code]

毫无疑问,是线程安全的

volatile http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
不是线程安全的 他不是原子操作

https://www.google.com.hk/search?newwindow=1&safe=strict&espv=210&es_sm=93&q=java+volatile+stackoverflow&oq=java+volatile+stack&gs_l=serp.3.0.0j0i30j0i8i30l2.4702.6536.0.8430.6.6.0.0.0.0.147.503.5j1.6.0....0...1c.1j4.35.serp..0.6.502.gDgUzYfwiHE

如果这个类供外部调用的话~就不算安全

问题没有描述清楚吧? 你这个类又没有类属性(静态属性) 多个线程拥有该类不同的实例,各自独立,怎么会有线程安全问题呢? 除非你是多个线程共用同一个该类的实例才会有线程安全问题啦

只有在状态真正独立于程序内其他内容时才能使用 volatile,你代码里面的setX方法明显违背这条规则

:D 楼主可以参看下这个文章 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

我猜你的意思是说这个类的一个实例被多个线程同时访问,如果是这样的话,你应该用AtomicInteger才对,肯定不是线程安全的

你的例子是线程安全的。 并且,去掉volatile 也是线程安全的。

因为你的程序中,只有对int型变量的 读、写操作,而按照Java虚拟机规范,所有对基本类型的操作,除了某些对long类型和double类型的操作之外,都是原子级的。

volatile 只是保证不同线程之间对变量修改的“可见性”。
即:在发生线程切换时,后面的线程能立即看到前面线程对变量的修改。

所以,除了long和double之外,线程安全是否取决于你的程序的语义:程序语义上是否要求连续的操作之间应保持一致性。(比如 在不同线程之间做一个计数器)

你的代码只是 get、set而已,就这两个操作来说,不存在线程安全问题。

天呀, 谁说是线程安全的, 误人子弟啊.

上面的这个程序只是保证了可见性

两个线程同时写, 仍然会有问题.

是线程安全的。
别忘了,变量x有volatile修饰。

volatile修饰的变量是否是线程安全的,是有一定的前提的,就是对变量操作一定不能是复合操作。恰恰x是没有复合操作的。

如果有不理解的,请见我以前写的一片文章:http://jameswxx.iteye.com/blog/806968