线程锁的学习,synchronized实现原理第一次理解

线程锁的学习,synchronized实现原理第一次理解


一、synchronized锁的实现原理?

synchronized锁的实现主要是通过jvm的Monitor对象实现的,通过持有Monitor获取锁,释放Monitor释放锁,而Monitor的内部

ObjectMonitor() {
    _header       = NULL;
    _count        = 0;
    // 当前正在等待该monitor的线程数量
    _waiters      = 0,
    // 该monitor被重入次数,初始时为0
    _recursions   = 0;
    _object       = NULL;
    // 该monitor的拥有者,当一个线程持有该monitor时
    // monitor会将该线程标记为owner
    _owner        = NULL;
    // 等待集合,所有调用了当前monitor的wait()方法的线程都存放在这里
    _WaitSet      = NULL;
    // 简单自旋锁,用于保护等待队列
    _WaitSetLock  = 0 ;
    _Responsible  = NULL ;
    _succ         = NULL ;
    // 最近刚刚阻塞在monitor入口的线程
    _cxq          = NULL ;
    FreeNext      = NULL ;
    // 阻塞在monitor入口的线程集合,即想要持有该monitor的线程集合
    _EntryList    = NULL ;
    // 自旋次数
    _SpinFreq     = 0 ;
    // 自旋时间
    _SpinClock    = 0 ;
    // 当前持有该monitor的是否是线程
    OwnerIsThread = 0 ;
    // 上一个该monitor的持有者线程ID
    _previous_owner_tid = 0;
}
    ......
  }

当线程请求锁时进入_EntryList 等待获取锁,请求Monitor获取Monitor_count++,_owner = 当前线程,_recursions=1,如果当前线程有事使用wait挂起线程,当前线程进入_WaitSet,当前线程需要通过notify()或者notifyAll()唤起线程进入等待线程队列(如果通过sleep()等待是不释放对象锁的),线程锁的释放会_count- -,_owner重新=null(还有很多细节需要学习)

二、锁的升级

为了合理分配电脑资源,锁从1.5还是1.6将原来锁(也就是现在的重量级锁)进行了分级(级别从低到高),还有锁可以升级不可以降级,但是偏向锁状态可以被重置为无锁状态。
锁的升级:无锁->偏向锁->轻量级锁(自旋锁)->重量级锁
无锁:就是不设锁
偏向锁:当请求是一个线程多次获得同一个锁,这时加锁就是浪费资源,所以就设置了偏向锁,一直由第一个线程获得锁
轻量级锁:轻量级锁是在偏向锁上升级而来,当在请求锁发生竞争关系,偏向锁就会被撤销升级成轻量级锁也就是自旋锁,自旋锁就是当第二个请求过来竞争锁,这时锁被持有,第二个线程没拿到锁的情况下不生成等待队列而是进行自旋等待锁的释放
重量级锁:而线程自旋超过一定的次数(默认10次),或者自旋时有第三个线程来竞争锁,这时锁就会从轻量级锁升级成重量级锁,也就是生成等待队列

三、锁粗化

按理来说,同步块的作用范围应该尽可能小,仅在共享数据的实际作用域中才进行同步,这样做的目的是为了使需要同步的操作数量尽可能缩小,缩短阻塞时间,如果存在锁竞争,那么等待锁的线程也能尽快拿到锁。
但是加锁解锁也需要消耗资源,如果存在一系列的连续加锁解锁操作,可能会导致不必要的性能损耗。
锁粗化就是将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁,避免频繁的加锁解锁操作。

四、锁消除

Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时进行编译,又称即时编译),通过对运行上下文的扫描,经过逃逸分析,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值