一、volatile不具备原子性案例
volatile可以强制线程从主内存中读取最新的数据,但是不能保证原子性像++操作
package com.zhq;
class VolatileNoAtomic extends Thread {
private static volatile int count;
@Override
public void run(){
for(int i=0;i<1000;i++){
count++;
}
System.out.println(getName()+"---->"+count);
}
}
/**
* @program: ThreadDemo
* @description: Volatile具有可见性,不具有原子性
* @author: hq.zheng
* @create: 2019-07-29 21:28
*/
public class VolatileNoAtomicDemo {
public static void main(String[] args) {
//初始化10个线程
VolatileNoAtomic[] volatileNoAtomics=new VolatileNoAtomic[10];
for(int i=0;i<volatileNoAtomics.length;i++){
//创建每个线程
volatileNoAtomics[i]=new VolatileNoAtomic();
}
for(int i=0;i<volatileNoAtomics.length;i++){
//启动线程
volatileNoAtomics[i].start();
}
}
}
最后结果不确定可能不为10000
二、修改解决原子性问题
package com.zhq;
import java.util.concurrent.atomic.AtomicInteger;
class VolatileNoAtomic extends Thread {
private static AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
count.incrementAndGet();
}
System.out.println(getName() + "---->" + count);
}
}
/**
* @program: ThreadDemo
* @description: Volatile具有可见性,不具有原子性
* @author: hq.zheng
* @create: 2019-07-29 21:28
*/
public class VolatileNoAtomicDemo {
public static void main(String[] args) {
//初始化10个线程
VolatileNoAtomic[] volatileNoAtomics = new VolatileNoAtomic[10];
for (int i = 0; i < volatileNoAtomics.length; i++) {
//创建每个线程
volatileNoAtomics[i] = new VolatileNoAtomic();
}
for (int i = 0; i < volatileNoAtomics.length; i++) {
//启动线程
volatileNoAtomics[i].start();
}
}
}
最后结果可以确定是10000