栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

与锁相关的知识

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

与锁相关的知识

与锁相关的知识 一、synchronized在jdk1.6中的更新

锁消除(无锁)

在没有操作共享变量的线程安全问题时,JVM会自动将锁消除。 锁粗化

为了避免频繁去获取和释放同一个锁资源,将锁粗化到外层。 锁升级

偏向锁 --> 轻量级锁 --> 重量级锁偏向锁

第一线程操作共享变量时,由于没有锁竞争,当前synchronized锁会偏向于当前线程,如果下次线程还来操作共享变量,就不需要竞争锁资源,直接获取并执行内部程序。当有其他线程也来操作这个共享变量时,出现了锁竞争问题,将偏向锁升级为轻量级锁。 轻量级锁

不会让线程进入到阻塞状态,通过CAS自旋的方式,频繁的尝试获取锁资源,如果一直使用自旋的方式获取锁资源,一直获取不到,造成了一些不必要的消耗。在jdk1.5中就已经存在自适应自旋锁,会根据上一次这个锁获取的时间,指定当前这次自适应自旋需要循环多少次尝试获取,在自适应次数中,可以正常的获取到锁资源。在自适应次数中,没有拿到锁资源,锁升级,将轻量级锁,升级为重量级锁。 重量级锁

线程阻塞,等待CPU时间片调用,内核态用户态来回切换(内核态和用户态的切换非常消耗资源,尽量避免)。

二、synchronized的实现原理

synchronized是基于对象实现的,每一个对象出生就是一把锁。创建对象需要在堆内存中开辟一片空间,在这片空间中,包含一片内容:对象头。在对象头中的MarkWord中保存这关于当前对象的一些锁信息。MarkWord指向C++中的ObjectMonitor,在ObjcetMonitor存在各种属性,去记录当前对象的锁信息。

三、 ReentrantLock

ReentrantLock

synchronized是关键字。ReentrantLock锁是一个类。synchronized加锁方式:同步方法,同步代码块。ReentrantLock加锁方式:调用lock加锁,调用unlock释放锁。synchronized自动自动释放锁资源。ReentrantLock必须手动执行unlock(必须放在finally代码块中)。synchronized就是非公平锁。ReentrantLock可以是公平锁,也可以是非公平锁。synchronized基于对象实现的。ReentrantLock是基于AQS实现的。synchronized无法指定等待锁资源的时长。ReentrantLock可以指定CAS尝试获取锁资源的时长。

ReentrantLock的非公平锁,在执行lock方法时,直接通过CAS尝试获取锁资源,没有获取到,Unsafe中的park方法,先当前线程进入阻塞状态。

ReentrantLock的公平锁,在执行lock方法时,先查看队列中是否有其他线程在排队,没有排队的再CAS尝试获取锁资源,有排队的直接,Unsafe中的park方法,先当前线程进入阻塞状态。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号