非原子性出现的问题:
例如:i++
是非原子性的操作:
i++实质为:
tap=i;
tbp=tap+1;
i=tbp;
当代码是非原子性的操作时,多线程的情况下就可能出现线程安全问题:
下面具体举例说明:
创建一个类,用于对变量j进行++操作1000次,并且将这个循环重复100遍
public class Onenon_atomic implements Runnable{
public void run(){
int a=0;
while (a<100){
int j=0;
for (int i = 0; i < 1000; i++) {
j++;
System.out.println(Thread.currentThread().getName()+"线程:。。"+j);
}
a++;
}
}
}
测试类,创建两个线程:thread.join()意为主线程运行到此代码时停止,直到子线程运行完毕后,主线程再运行之后的代码
import com.one.Onenon_atomic;
public class Onenon_atomicTest {
public static void main(String[] args) throws InterruptedException {
Thread thread1=new Thread(new Onenon_atomic());
Thread thread2=new Thread(new Onenon_atomic());
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
结果:可以看出,线程开启后,j 并不是从0开始的,说明 j++ 的执行过不是原子性的。原子性时,完整的执行了 j++ ,不会出现以上情况(结论不对,回头再看)
d-0线程:。。829
Thread-0线程:。。830
Thread-1线程:。。110
Thread-1线程:。。111
Thread-1线程:。。112
Thread-1线程:。。113
Thread-1线程:。。114
------------------------------------------------------------------------
综上所述,为了解决非原子性的问题,我们利用AtomicInteger类中的一些方法来保证 ++/-- 能够原子性的进行操作: