使用了volatile就一定线程安全吗?
public class TestAtomic {
public static void main(String[] args) {
ThreadB threadB = new ThreadB();
for (int i = 0; i < 10; i++) {
new Thread(threadB).start();
}
}
}
class ThreadB implements Runnable{
private volatile int number;
@Override
public void run() {
System.out.println(getNumber());
}
public int getNumber() {
return number++;
}
}
出现了两个相等的值。
说明volatile只能保证可见性,并不能让变量具备原子性。
根本原因是java的++操作并不是一个原子操作。
++操作其实是 先从内存取出值,然后对这个值+1。
当多个线程同时++就会出现数据错误的情况。
解决方案是代码做如下修改,使用原子类AtomicInteger
class ThreadB implements Runnable{
//private volatile int number;
private AtomicInteger number;
@Override
public void run() {
System.out.println(getNumber());
}
public int getNumber() {
return number.getAndIncrement();
}
}