volatile

保证可见性(防止指令重排序)

参考cpu缓存模型,volatile底层是通过对cpu总线加锁。(总线加锁力度较大,一般为锁总线行),被volatile修饰的变量,会在cpu级别加总线锁,保证JMM模型中线程的工作内存即使读的是cpu缓存中的数据,也能保证其数据的准确性。(用于个人理解),更正确的解释:volatile修饰的变量,会强制读取主存数据。底层如何读取主存数据感觉应该是我理解的那样。

synchronized

Java提供的隐式锁,基于monitor机制,Java对象为ObjectMonitor。

ObjectMonitor

并发(volatile synchronized)

如图所示:底层维护阻塞队列以及等待队列。

提供下列方法:必须与synchronized一起用

wait()      等待

notify() 唤醒

区别

1.volatile只能修饰变量。不会导致线程阻塞

2.synchronized锁方法、变量、类,会阻塞线程

3.volatile保证不了原子性,但是不会编译器优化(指令重排序)单例双检索需要用volatile修饰,防止new对象指令重排序

总结

该文章描写了volatile和synchronized的大概情况,主要用于作者本人回顾知识。部分点为自己理解的意思,请谨慎参考。下篇文章为aqs相关

相关文章:

  • 2021-12-31
  • 2021-07-28
  • 2021-10-03
  • 2019-01-23
  • 2021-06-19
  • 2021-07-12
猜你喜欢
  • 2021-05-11
  • 2021-06-27
  • 2021-10-12
  • 2021-05-08
  • 2022-01-06
  • 2021-08-17
  • 2021-08-28
相关资源
相似解决方案