2021面试 Lock,synch,dcl双检查锁sy+volite,悲观锁,偏向,轻量锁,重量锁,升级12
0.数据库悲观锁:for update: MySQL实现悲观锁_九色鹿-CSDN博客_mysql悲观锁怎么实现
1. ReentrantLock锁公平与非公平实现、重入原理: ReentrantLock(重入锁)实现原理与公平锁非公平锁区别_ThinkWon的博客-CSDN博客
2.悲观锁、乐观锁、自旋锁的使用场景、实现方式、优缺点 :【锁】悲观锁和乐观锁、自旋锁|各种锁的使用场景_bandaoyu的note-CSDN博客
3.偏向锁、轻量级锁、重量级锁底层原理、升级过程: https://blog.csdn.net/zhangzhen02/article/details/106494973
4.sync:死磕 Synchronized 底层实现
5.Double Check Locking 双检查锁机制:
Java中的双重检查锁(double checked locking) - Decouple - 博客园
1.lock
1.几个关键词:计数值,双向链表,cas+自旋
2.ReentrantLock是有公平锁和非公平锁实现,创建对象时候通过一个boolean的参数设置ture,提供就是公平锁,否则为非公平。而这两个锁都实现AQS,AqS实现AOS。
// 默认构造方法,非公平锁public ReentrantLock() {sync = new NonfairSync();}// 构造方法,公平锁public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}
(1)非公平锁:每个线程进来和队列里面的线程都有机会拿到锁!!!
lock()方法的逻辑: 多个线程调用lock()方法, 如果当前state为0, 说明当前没有线程占有锁, 那么只有一个线程会CAS获得锁, 并设置此线程为独占锁线程。那么其它线程会调用acquire方法来竞争锁(后续会全部加入同步队列中自旋或挂起)。当有其它线程A又进来想要获取锁时, 恰好此前的某一线程恰好释放锁, 那么A会恰好在同步队列中所有等待获取锁的线程之前抢先获取锁。也就是说所有已经在同步队列中的尚未被 取消获取锁 的线程是绝对保证串行获取锁,而其它新来的却可能抢先获取锁。后面代码解释。
1.通过方法tryAcquire(arg)
尝试的获取锁 ;
2.若是没有获取到锁,通过该方法acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
就将当前的线程加入到存储等待线程的队列中。
(2)公平锁:
lock()方法对比非公平锁, 没有了if else 也就意味着新来的线程没有插队的机会, 所有来的线程必须扔到队列尾部, acquire方法也会像非公平锁一样首先调用tryAcquire插队试试,但是只有队列为空或着本身就是head,那么才可能成功,如果 队列非空那么肯定被扔到队列尾部去了, 无法插入。
3.unlock();释放锁:
有release()方法 ,里面还有tryRelease()方法;
区别:
其中tryAcquire是公平锁和非公平锁实现的区别,下面的两种类型的锁的tryAcquire的实现,从中我们可以看出在公平锁中,每一次的tryAcquire都会检查CLH队列中是否仍有前驱的元素,如果仍然有那么继续等待,通过这种方式来保证先来先服务的原则;而非公平锁,首先是检查并设置锁的状态,这种方式会出现即使队列中有等待的线程,但是新的线程仍然会与排队线程中的对头线程竞争(但是排队的线程是先来先服务的),所以新的线程可能会抢占已经在排队的线程的锁,这样就无法保证先来先服务,但是已经等待的线程们是仍然保证先来先服务的,所以总结一下公平锁和非公平锁的区别:
1、公平锁能保证:老的线程排队使用锁,新线程仍然排队使用锁。
2、非公平锁保证:老的线程排队使用锁;但是无法保证新线程抢占已经在排队的线程的锁。
2.synchronized
是一个重量级锁,作用在:(1)代码块中(2)普通方法 (3)静态方法
(1)代码块时候:反编译看字节码指令
每个对象都拥有一个monitor
对象,代码块的{}
中会插入monitorenter
和monitorexit
指令。当执行monitorenter
指令时,会进入monitor
对象获取锁,当执行monitorexit
命令时,会退出monitor
对象释放锁。同一时刻,只能有一个线程进入在monitorenter
中。
一般有两个monitorexit
指令,一个插入在异常位置,一个插入在方法结束位置。
(2)方法时候:多了一个判断标志acc_synchronized
方法中会添加一个叫ACC_SYNCHRONIZED
的标志,当调用方法时,首先会检查是否有ACC_SYNCHRONIZED
标志,如果存在,则获取monitor
对象,调用monitorenter
和monitorexit
指令。
偏向锁、轻量级锁、重量级锁、自旋锁原理讲解 - 云+社区 - 腾讯云
1.偏向锁:
在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下次再想要获得锁时,不需要再获得锁(即忽略synchronized关键词),直接就可以执行同步代码,比较适合竞争较少的情况。
2.轻量级锁
轻量级锁采用CAS自旋锁的方式来完成加锁,相对于重量级锁加锁的代价相对小一些,如果一直获取不到锁状态,自旋占用的资源会超过重量级锁,所以轻量级锁膨胀为重量级锁的条件就是自旋达超过一定次数(默认为10,可以修改PreBlockSpin参数调整)。
3.重量级锁
即当有其他线程占用锁时,当前线程会进入阻塞状态。
3. java对象:Java的对象头和对象组成详解_Clarence-CSDN博客
1.对象头
1.1 mark word :记录对象和锁的有关信息,
1.2 指向类的指针:java对象的类数据保存在方法区
1.3 数组长度(只有数组对象才有):只有数组对象保存这部分数据,该数据在32位和64位JVM中长度都是32bit。
2.实例数据 :java代码中能看到的属性和他们的值
3.对齐填充字节:补齐对象内存大小
4 .synchronized和ReentrantLock区别?
【Java并发编程】ReentrantReadWriteLock源码及实现原理分析_fxkcsdn的博客-CSDN博客_reentrantreadwritelock 原理 lock原理
(1) syn是关键字(2)Reentrantlock是基于类,更多更灵活。可以设置锁过期时间防止死锁
1. ReentrantLock显示的获得、释放锁,synchronized隐式获得释放锁
2. ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的 不可用性提供了更高的灵活性
3. ReentrantLock是API级别的,synchronized是JVM级别的
4. ReentrantLock可以实现公平锁
5. ReentrantLock通过 Condition可以绑定多个条件
6. 底层实现不一样, synchronized是同步阻塞,使用的是悲观并发策略,lock是同步非阻 塞,采用的是乐观并发策略
7. Lock 是一个接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言 实现。
8. synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生; 而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象, 因此使用Lock时需要在finally块中释放锁。
9. Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时, 等待的线程会一直等待下去,不能够响应中断。
10. 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
11. Lock可以提高多个线程进行读操作的效率,既就是实现读写锁等。
5. synchronized是一个重量级锁,作用在:(1)代码块中(2)普通方法 (3)静态方法
(1)代码块时候:反编译看字节码指令
每个对象都拥有一个monitor
对象,代码块的{}
中会插入monitorenter
和monitorexit
指令。当执行monitorenter
指令时,会进入monitor
对象获取锁,当执行monitorexit
命令时,会退出monitor
对象释放锁。同一时刻,只能有一个线程进入在monitorenter
中。
一般有两个monitorexit
指令,一个插入在异常位置,一个插入在方法结束位置。
(2)方法时候:多了一个判断标志acc_synchronized
方法中会添加一个叫ACC_SYNCHRONIZED
的标志,当调用方法时,首先会检查是否有ACC_SYNCHRONIZED
标志,如果存在,则获取monitor
对象,调用monitorenter
和monitorexit
指令。
6。锁的高低级别为:无锁
→偏向锁
→轻量级锁
→重量级锁; 且只能从低到高不可逆
2021面试 Lock,synch,dcl双检查锁sy+volite,悲观锁,偏向,轻量锁,重量锁,升级12相关推荐
- 并发系列三:证明分代年龄、无锁、偏向锁、轻量锁、重(chong)偏向、重(chong)轻量、重量锁
前言 上篇文章咱们了解了synchronized关键字的常见用法.对象头以及证明了一个对象在无锁状态下的对象头markwork部分的前56位存储的是hashcode.接下来,咱们继续来根据对象头分别证 ...
- DCL双检查锁机制实现线程安全的单例设计模式
实现线程安全的单例设计模式的三种方式: DCL双检查锁机制实现线程安全 使用静态内置类实现线程安全 使用static代码块实现线程安全 -------------------------------- ...
- 多线程:无锁、偏向锁、轻量锁、重量级锁
一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因? --->synchronized的重量级别的锁,就是在线程运行到该代码块的时候,让程序的运行级别从用户态切换到内核态,把所有 ...
- muduo源码剖析——Singleton单例模式之懒汉模式与DCL双重检查
0 懒汉与饿汉 对于Singleton单例模式我们并不陌生,但我们常用的多是饿汉模式: Singleton实例的声明和实例化在instance()函数中同时完成. 而懒汉模式要求,Singleton实 ...
- 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(13)--- 线程安全接口和双检查加锁优化...
4.3线程安全接口(Thread-Safe Interface) 1.问题 多线程组件通常包括多个可被公共访问的接口方法以及可以改变组件状态的私有方法.为了避免出现竞争条件,可以使用一个组件内部的锁对 ...
- MySQL InnoDB 锁介绍及不同 SQL 语句分别加什么样的锁
作者:iceman1952(本文来自作者投稿) 本文中,我们详细介绍MySQL InnoDB存储引擎各种不同类型的锁,以及不同SQL语句分别会加什么样的锁. 阅读提示 1. 本文所参考的MySQL文档 ...
- mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- delete select语句_MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁
作者:iceman1952 链接:https://blog.csdn.net/iceman1952/article/details/85504278 本文中,我们详细介绍MySQL InnoDB存储引 ...
- java 偏向锁 重偏向_锁原理:偏向锁、轻量锁、重量锁
java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁.偏向锁.轻量级锁.重量级锁.每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级. 一.ja ...
最新文章
- tsconfig.json编译选项
- 巧用Win2003负载平衡服务实现LCS2005企业版的部署:LCS2005系列之五
- 20175213 2018-2019-2 《Java程序设计》第9周学习总结
- [css] css中兼容ie浏览器的前缀是什么?
- android实现后台静默安装,Android 静默安装实现方法
- pythontype函数使用_Python astype(np.float)函数使用方法解析
- Visual Studio Code预览版Ver 0.3.0试用体验
- Phoronix Test Suite 0.7.0发布Linux下的测试软件
- shell 学习笔记2
- 5G 即将带来冲击!| 畅言
- Flex JSP with HttpService
- PHP能源管理系统ems,能源管理系统(EMS)方案.doc
- DELL服务器安装centos系统
- 为WINPE加入IMDISK 内存硬盘,虚拟磁盘,加速磁盘访问
- 决策树算法(ID3算法)
- 什么是顶尖的互联网产品经理?
- ansible管理变量、机密和事实
- Jenkins RestAPI调用出现Error 403 No valid crumb was included in the request [亲测有用]
- Java毕设项目共享充电宝系统(java+VUE+Mybatis+Maven+Mysql)
- 卧槽!可拆卸电池手机,又要杀回来了
热门文章
- JSON对象与字符串之间的转换
- linux音响操作系统,PulseAudio 13.0 发布,杜比TrueHD和DTS-HD主音频支持
- I.MX6ULL_Linux_系统篇(20) kernel分析-menuconfig
- 能装机,能在无光驱的实机稳定启动的reactos版本
- android 自定义透明progressdialog,在android中自定义progressdialog动态创建
- 企鹅号怎么营运;企鹅号这样赚钱
- 【嵌入式08.1 - 实验】基于STM32F103C8T6开发板和OLED显示学号姓名+滑频显示
- ubundu pip时报错:Could not get lock /var/lib/dpkg/lock
- Machine Learning 扫盲
- 二叉树层次遍历:队列