面试连环炮系列(三):synchronized怎么用的
synchronized怎么用的?
用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁。它可以修饰静态方法或者一个类的class对象,这叫类锁;可以修饰普通方法或者代码块,这叫对象锁。synchronized是可重入锁吗?
从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的资源时,这种情况属于重入锁,请求将会成功。java中synchronized是基于原子性的内部锁机制,是可重入的。synchronized的实现原理了解过吗?
synchronized使用了monitorenter和monitorexit指令实现同步,这两个指令本质上都是对一个对象的监视器(monitor)进行获取。这个过程是排他的,同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。线程执行到monitorenter指令时,会尝试获取对象所对应的monitor所有权,也就是尝试获取对象的锁,而执行monitorexit,就是释放monitor的所有权。- 能说说synchronized的锁升级吗?
jdk1.6以后对synchronized的锁进行了优化,锁的级别从低到高逐步升级:无锁->偏向锁->轻量级锁->重量级锁。但是锁的升级是单向的,只能从低到高升级,不会降级。JVM中对象在内存中的布局分为三块区域:对象头、实例变量和填充数据。对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。Mark Word用于存储对象自身的运行时数据,它是实现轻量级锁和偏向锁的关键。- 如果一个线程获得了锁,锁就进入偏向模式,此时Mark Word的结构变为偏向锁结构,当这个线程再次请求锁时,无需再做任何同步操作,这样就省去了大量有关锁申请的操作,提高了程序的性能。
- 在锁竞争激烈的场合,每次申请锁的线程都是不相同的,偏向锁就失效了,偏向锁失败后升级为轻量级锁。轻量级锁是相对于使用操作系统互斥量来实现的传统锁而言的,它所适应的场景是线程交替执行同步块,如果存在同一时间访问同一锁的情况,就会膨胀为重量级锁。
- 轻量级锁失败后,还会进行自适应自旋。大多数情况下线程持有锁的时间都不会太长,如果操作系统层面直接挂起,线程之间的切换时需要从用户态转换到核心态,这个状态的转换需要比较长的时间。自旋锁假设在当前的线程很快可以获得锁,虚拟机会让当前线程做50个循环或100循环空循环。在经过若干次循环后,如果得到锁就顺利进入临界区。如果还不能获得锁就会将线程挂起,升级为重量级锁了。注意,JVM还会自动调整自旋次数,这次成功了,下次自旋的次数会多;如果失败了,下次自旋的次数就会减少。
参考文章:
https://blog.csdn.net/u011212394/article/details/82228321
https://www.cnblogs.com/fuly550871915/p/4890753.html
https://www.cnblogs.com/paddix/p/5405678.html
鸡汤:不要因为走得太远,忘了我们为什么出发。— 纪伯伦
面试连环炮系列(三):synchronized怎么用的的更多相关文章
- 面试连环炮系列(四):说说TCP的三次握手过程
说说TCP三次握手的过程? 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认. 第二次 ...
- 面试连环炮系列(十五):说说Eureka的高可用方案
说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...
- 面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的
为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一 ...
- 面试连环炮系列(十):一个线程调用两次start会怎么样
一个线程调用两次start会怎么样 Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常. 谈谈线程的生命周期和状态转移 新 ...
- 面试连环炮系列(六):Dubbo应用为什么要部署Zookeeper
Dubbo应用为什么要部署Zookeeper? Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口.由于Z ...
- 面试连环炮系列(二十三): StringBuffer与StringBuild的区别
StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...
- 面试连环炮系列(二十一):你们的项目怎么使用kafka
你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...
- 面试连环炮系列(二十):TCP的滑动窗口协议是什么
TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...
- 面试连环炮系列(十四): HTTP状态码302的跳转逻辑
HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...
随机推荐
- Spring(Bean)2
<!-- util:list封装的心 --> <bean id="personList2" class="spring.beans.di.collect ...
- P1046 陶陶摘苹果
题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...
- Chapter 02—Creating a dataset(Part3-补充材料Stat/Transfer)
Stat/Transfer:在电子表格(worksheet),数据库(database),统计包(statistical package)间进行数据转换,具有简单高效的特点. 资料来源于:http:/ ...
- [学习笔记] [数据分析] 02、NumPy入门与应用
01.NumPy基本功能 ※ 数据类型的转换在实际操作过程中很重要!!! ※ ※ ndarray的基本索引与切片 ※ 布尔型数组的长度必须跟被索引的轴长度一致 花式索引是利用“整数数组”进行索引. 整 ...
- Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- sbt assembly a fat jar for spark-submit cluster model
在用spark-submit提交作业时,用sbt package打包好的jar程序,可以很好的运行在client模式,当在cluster模式, 一直报错:Exception in thread &qu ...
- luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
- UIScrollView,UICollectionView 和UITableView的属性和方法
UIScrollView,UICollectionView 和UITableView 三者之间的关系:UIScrollView是 UICollectionView 和 UITableView 的父类. ...
- Evevt Loop 事件循环
目录 JavaScript 是一门单线程的语言 一.什么是event Loop的执行机制 练习 异步任务-setTimeout 练习1: 练习2: 练习3: 练习4: 二 事件队列作用 同步任务 例1 ...
- POJ1458 Subsquence
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...