volatile
保证可见性(防止指令重排序)
参考cpu缓存模型,volatile底层是通过对cpu总线加锁。(总线加锁力度较大,一般为锁总线行),被volatile修饰的变量,会在cpu级别加总线锁,保证JMM模型中线程的工作内存即使读的是cpu缓存中的数据,也能保证其数据的准确性。(用于个人理解),更正确的解释:volatile修饰的变量,会强制读取主存数据。底层如何读取主存数据感觉应该是我理解的那样。
synchronized
Java提供的隐式锁,基于monitor机制,Java对象为ObjectMonitor。
ObjectMonitor
如图所示:底层维护阻塞队列以及等待队列。
提供下列方法:必须与synchronized一起用
wait() 等待
notify() 唤醒
区别
1.volatile只能修饰变量。不会导致线程阻塞
2.synchronized锁方法、变量、类,会阻塞线程
3.volatile保证不了原子性,但是不会编译器优化(指令重排序)单例双检索需要用volatile修饰,防止new对象指令重排序
总结
该文章描写了volatile和synchronized的大概情况,主要用于作者本人回顾知识。部分点为自己理解的意思,请谨慎参考。下篇文章为aqs相关