java内存模型及线程安全问题
原子性: 原子性是指一个操作是不可中断的,即时是多个线程一起执行的时候,操作一旦开始,就不会被其它线程干扰。
有序性:优化重排,导致并发执行的结果可能不是你想要的。
一条指令的执行步骤 : 1. 取指IF
2.译码及读取寄存器操作数ID
3.执行或者有效地址计算EX
4.存储器访问MEM
5.写回WB
可见性:当某个线程修改了某个共享变量的值,其他线程是否能够 立即知道这个修改。(编译器的优化,硬件优化)
1.保证此变量对所有的线程的可见性,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存来完成。声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。
volatile :1.保证此变量对所有的线程的可见性,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存来完成。声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。当为单核cpu时,为原子操作,否则都为非原子操作。
性能比sync的开销更小,一种轻量级的同步机制,不是原子操作。
2.禁止指令重排序优化。
浙公网安备 33010602011771号