我的上一篇博文讲到了,Volatile不能保证原子性,代码如下:
package com.newDemo.controller.test;
import java.util.concurrent.atomic.AtomicInteger;
public class threadDemo15 extends Thread {
private volatile static int count=0; //static 修饰的变量,所有的线程都会共享,因为存在在方法区,只会存放一次。
// private static AtomicInteger count = new AtomicInteger(0); //jdk1.5并发包里面的内容
public void run(){
for (int i = 0; i < 1000; i++) {
count++;
// count.incrementAndGet();
}
System.out.println(getName()+";"+count);
// System.out.println(getName()+";"+count.get());
}
public static void main(String[] args) {
threadDemo15[] threadlist=new threadDemo15[10];
for (int i = 0; i < threadlist.length; i++) {
threadlist[i]=new threadDemo15();
}
for (threadDemo15 threadDemo15 : threadlist) {
threadDemo15.start();
}
}
}
这样运行下来,总是没有10000,就是说volatile 代码的原子性保证不了。
解决思路
AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。
代码如下:
package com.newDemo.controller.test;
import java.util.concurrent.atomic.AtomicInteger;
public class threadDemo15 extends Thread {
// private volatile static int count=0; //static 修饰的变量,所有的线程都会共享,因为存在在方法区,只会存放一次。
private static AtomicInteger count = new AtomicInteger(0); //jdk1.5并发包里面的内容
public void run(){
for (int i = 0; i < 1000; i++) {
//count++;
count.incrementAndGet();
}
System.out.println(getName()+";"+count);
System.out.println(getName()+";"+count.get());
}
public static void main(String[] args) {
threadDemo15[] threadlist=new threadDemo15[10];
for (int i = 0; i < threadlist.length; i++) {
threadlist[i]=new threadDemo15();
}
for (threadDemo15 threadDemo15 : threadlist) {
threadDemo15.start();
}
}
}
这个里面有10000,就说明AtomicInteger能保证原子性问题。