synchronized与volatile原理

2020-06-13  本文已影响0人  simonenfp

synchronized使用

synchronized实现

Monitor对象

Monitor 可以理解为一个同步工具,实际上,它是被保存在对象头中的一个对象,Java对象的对象头由 mark word 和 klass pointer 两部分组成,其中mark word存储了同步状态、标识、hashcode、GC状态等等;而Monitor锁则是存在于对象的mark word中。

在Monitor的内部有一些关键属性:

  1. owner指向持有锁的线程
  2. entryList存放等待获取锁处于block状态线程的队列
  3. waitSet存放wait状态线程的队列
  4. 计数器:记录线程获取锁的次数 等等
    在多线程同时访问一段同步代码块,首先都会进入entry队列,当某个线程通过竞争获取锁时,owner会指向它(即此获取锁),同时monitor中的计数器也会加+1,若持有锁的线程执行结束会释放锁,并复位owner值,计数器也会-1,若持有锁的线程调用wait方法会进入waitSet线程队列

Java虚拟机对synchronized的优化

从 Java 6 开始,虚拟机对 synchronized 关键字做了很多优化,主要目的是减少重量级锁的使用次数,最终减少线程上下文切换的频率 。其中主要做了以下几个优化: 自旋锁、轻量级锁、偏向锁

锁的状态

一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,目的是为了提高获得锁和释放锁的效率

volatile原理

有volatile变量修饰的变量进行写操作的时候会使用CPU提供的Lock前缀指令,会对CPU总线和高速缓存加锁

volatile作用

上一篇 下一篇

猜你喜欢

热点阅读