Volatile和Synchronized详解
知识准备:所有对基本类型的操作,除了某些long类型和double类型的操作之外,都必须是原子的,
一个java程序对应一个虚拟机实例
每一个虚拟机实例都有一个主存,用于保存所有的(对象的实例变量,数组的元素及类变量)每一个线程都有一个工作内存,因为它们每个线程是私有的。
管理低层线程行为的规则:
把变量的值从主存拷贝到它的工作内存
把它的值从工作内存写回到主存。
具体区别:
Volatile修饰的变量具有可见性,也就是说一旦一个线程修改了被Volatile修饰的变量,则被修改的值会立即更新到主存。然后另一个线程基于这个值可以继续修改。
Volatile只能修饰变量,不过在使用基本类型的变量作为共享变量时,最好使用并发包中的Atomic*等类修饰,而Synchronized不仅可以修饰变量,还可以修饰方法。
Volatile不保证原子性,synchronized不仅保证可见性,还保证原子性。保证所有语句全部执行完毕。