volatile是一个类型修饰符(type specifier).volatile的做用是做为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile是轻量级锁(无锁同步),sychonised是重量级锁,volatile效率远高于sychonised。缓存
具体实现:缓存值过时通知。优化
cpu忙时,直接使用缓存中的内容,而在cpu闲的时候才会去主存中从新读取数据。而加上volatile,则该属性变动时,将会通知全部使用它的缓存来更新值。spa
加了volatile,线程之间是可见的。线程
而不加volatile只能用sychonized,效率低。对象
volatile和sychonised区别内存
1.volatile效率远高于sychonisedci
2.volatile不可彻底替代sychonised,由于volatile只能保证可见性,可是sychonised除了保证可见性,还能保证原子性。字符串
Atomic开头的操做,能够代替简单的sychonised,效率比synchronized高。编译器
细粒度的锁比粗粒度的锁效率高不少。同步
sychonized锁的究竟是什么?
sychonised锁的不是栈内存的句柄,而是句柄所指向的堆内存中的对象实体,因此若是咱们锁住了对象o,但以后又对o赋值new Object(),那么o将能够再次被进入,由于句柄o所指向的实体已经不是原来那个了。
因此o的原来的实体和新的实体分别锁住了两个实体。
同理能够考虑得出字符串常量不能做为锁,由于对于常量不一样的句柄能够指向同一个对象,如s1="hello",s2="hello",不一样的同步方法可能都须要字符串常量“hello”加锁,可能致使死锁。