有如下代码:
public class VolatitleNoAtomic extends Thread {
private static volatile int count = 0 ;
private void addCount(){
for (int i = 0; i < 1000; i++){
count ++ ;
}
System.out.println(count);
}
@Override
public void run() {
addCount();
}
public static void main(String[] args) {
VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
for (int i = 0 ; i < 10 ; i++){
arr[i] = new VolatitleNoAtomic();
}
for (int i = 0 ; i < 10 ; i++){
arr[i].start();
}
}
}
运行结果:
这里count已然加上了volatitle关键字修饰,但是产生的数据依旧是线程不安全的。这里说明volatile只是具有可见性,但是本身不具备原子性。在不使用synchronized同步机制或其他同步机制的情况下,可以使用原子数据类型本身可以有一个比较轻量的方式。要实现原子性,建议使用Atomic系列的类
修改后的代码:
public class VolatitleNoAtomic extends Thread {
// private static volatile int count = 0 ;
private static AtomicInteger count = new AtomicInteger(0) ;
private void addCount(){
for (int i = 0; i < 1000; i++){
count.incrementAndGet();
}
System.out.println(count);
}
@Override
public void run() {
addCount();
}
public static void main(String[] args) {
VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
for (int i = 0 ; i < 10 ; i++){
arr[i] = new VolatitleNoAtomic();
}
for (int i = 0 ; i < 10 ; i++){
arr[i].start();
}
}
}
运行结果: