看了线程并发的部分内容, :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
不是线程安全的 他不是原子操作
如果这个类供外部调用的话~就不算安全
问题没有描述清楚吧? 你这个类又没有类属性(静态属性) 多个线程拥有该类不同的实例,各自独立,怎么会有线程安全问题呢? 除非你是多个线程共用同一个该类的实例才会有线程安全问题啦
只有在状态真正独立于程序内其他内容时才能使用 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