两条规定:
1、线程对共享变量所有的操作都必须在自己的工作内存中进行,不能直接从主内存中读取。
2、不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来进行。
voltaile实现内存的可见性
深入来说是通过加入内存屏障和禁止重排序优化来实现的
1、对volatile修饰的变量执行写操作时,会在写操作后加一条store屏障指令
2、对volatile修饰的变量执行都操作时,会在读操作之前load屏障指令
volatile修饰的变量不能保证原子性,只能保证可见性。
多线程中安全的使用volatile变量,必须同时满足以下两个条件:
1、对变量的写入操作不依赖当前的值。
2、该变量没有包含在具有其他变量的不变式中。
volatile和synchronized的区别
volatile本质是告诉虚拟机当前对象的在工作内存的值是不确定的,需要从主内存获取,synchronized是下对象只能被当前线程读或写,其他线程是被阻塞在同步块之外的,当前线程完成后其他线程才能排队操作变量;
volatile仅仅能作用在变量而synchronized可以用在变量方法和类级别;
volatile仅仅能够保证变量的可见性不能保证原子性;synchronized可以保证变量修改的可见性和原子性;
volatile修饰的变量不能被编译器优化(禁止重排序),synchronized修饰的可以被编译器优化;
volatile不会造成线程阻塞,synchronized可能造成线程阻塞;
浙公网安备 33010602011771号