有如下代碼:
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();
}
}
}
運(yùn)行結(jié)果:
image.png
這里count已然加上了volatitle關(guān)鍵字修飾,但是產(chǎn)生的數(shù)據(jù)依舊是線(xiàn)程不安全的。這里說(shuō)明volatile只是具有可見(jiàn)性,但是本身不具備原子性。在不使用synchronized同步機(jī)制或其他同步機(jī)制的情況下,可以使用原子數(shù)據(jù)類(lèi)型本身可以有一個(gè)比較輕量的方式。要實(shí)現(xiàn)原子性,建議使用Atomic系列的類(lèi)
修改后的代碼:
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();
}
}
}
運(yùn)行結(jié)果:
image.png