并发编程的三大特性: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
}