并发编程的三大特性:1.原子性;2可见性(JMM问题);3.有序性(指令重排)
1.原子性的概念:一件事情不可再分,在java中就是不可以再次分割,可以看作是一个步骤,或者多个步骤,但是要求是顺序不可变,同时不能被分割。整个操作是为一个整体。要么全部执行完成,别人不能被执行。
2.实现的原子性方式就是使用synchronized或者lock的ReentrantLock,或者可重入读写锁;
3.一行代码是具有原子性的吗?很明显不是,字节码可能由多个指令构成,甚至是机器码更多操作。一条机器码具有原子性,但是一行代码不一定保证具有原子性
4.volatile的作用:防止指令重排,解决可见性问题,但是不能保证原子性;
5.证明volatile不具备原子性:
package com.ydlclass.lock;
public class AtomicTest {
public static volatile int COUNT;
public static void main(String[] args) {
for (int i = 0; i < 500; i++) {//多线程的在数值比较低的时候可能会产生一定的问题;
new Thread(() ->{
ThreadUtil.sleep(90);//如果执行的太快可能不会产生多线程的问题,for只是创建对象,线程中的内容交给run方法是实现;
//等待10ms足够第二个线程的启动
COUNT++;
}).start();
}
ThreadUtil.sleep(3000);
System.out.println(COUNT);
}
//最会的结果并不一定是500
}