1.什么是原子性,可见性,有序性
- 原子性是指一个线程的操作是不能被其他的线程打断的,同一个时间,一个变量只能由一个线程进行操作,在多个线程情况下,每一个线程的执行结果不受其他线程的干扰。例如n++100,n初始值为0,经过线程的操作之后,n的结果值为100,这时候说线程之间是互不干扰的,这也就是原子性,n++并不是原子操作,为了保证原子操作,使用AtomicLong来保证原子性。
- 可见性是指某一个线程对一个共享变量的值进行修改之后,其余的线程是可以看到最新的修改值,对于单线程来说,拿到的值一定是最新的修改值,多线程就不一定了。
每一个线程都有属于当前线程工作的内存,它会把主内存中的值读取到工作内存,相当于一个副本,此时当前线程会把工作内存中的值刷回主内存,其余的线程会拿到主内存中的值,这是一个过程,当还没刷回主内存的时候这时候对其他线程是不可见的,所以其他线程从主内存读到的值是修改之前的旧值。
- 有序性是指程序代码按顺序执行的,单线程是由这样的,多线程就不一定了,也就说前面的代码并不一定都会在后面的代码前面执行,即后面的代码可能会插到前面的代码之前执行,只要不影响当前线程的执行结果。所以,指令重排只会保证当前线程执行结果一致,但指令重排后势必会影响多线程的执行结果。虽然重排序优化了性能,但也是会遵守一些规则的,并不能随便乱排序,只是重排序会影响多线程执行的结果。