同步机制之一--Synchronized,以及此机制下的锁的本质和种类
Java中,为了实现同步的操作临界区,线程在执行临界区的代码时,需要获得某个对象的锁。本文介绍获得对象的锁的方法之一----Synchronized关键字。
Synchronized关键字的用法
Class Test {
....
Object o = new Object(); public synchronized test() { //第一种用法
....
}
public test_1 () {
synchronized (o) { //第二种用法
....
}
}
}
Synchronized关键字有两种用法,一种修饰方法,作用在调用此方法的对象;一种修饰代码块,在括号中指定作用的对象。在上面的例子中,在某个线程中创建Test对象 t ,在线程1调用 t.test() 则线程需要获取 t 的锁;调用 t.test_1() 线程则需要 t 持有的对象 o 的锁。
Synchronized机制下锁的本质
锁的本质实际上就是对象的头部几个bit的标志而已,根据这些标志不同,对象又分出了无锁(01),偏向锁(01),轻量级锁(00),重量级锁(10),锁可以从左至右逐渐升级,却不能降级。具体如下表格
由于 01 状态可以表示两种锁,因此 锁标志为01时,还要检查偏向锁标志,为1表示偏向锁,为0表示无锁。
为什么需要这么多种类的锁呢?JDK1.6(应该是)为了解决线程用Synchronized获取锁失败后必须阻塞等待的情况,因为这样效率太低了。下面介绍几种锁的机制。
偏向锁
对象初始的锁默认是偏向锁,可以通过XX: -UseBiasedLocing = false 放弃使用偏向锁,那么所有对象的默认锁就是轻量级锁。当一个对象是偏向锁时,对象头里会存储着此对象偏向的线程id的信息。一个线程获取某个对象的偏向锁的流程如下:
一个线程持有某个对象的偏向锁,并且受到竞争,偏向锁就有可能膨胀为轻量级锁,流程如下:
轻量级锁
轻量级锁由偏向锁膨胀而来,它的特点是获取轻量级锁失败的线程不会陷入阻塞。而是通过CAS的方式去获取锁,失败则重试,再次进行CAS操作去获取锁,也称自旋。CAS是一个原子操作,以后再总结。
如果是一个线程以及获得了某个对象的轻量级锁,还被其他线程不断竞争,轻量级锁就会膨胀为重量级锁。
获取轻量级锁的过程如下:
大概就是: 线程p的栈中有一块空间local record专门存放以经获取到的对象锁的信息。首先,将要目标对象的mark word拷贝进local record;然后对象的mark word部分就变为一个指针,指向displaced空间,更新锁标志、状态; 最后把local record的 owner 指针指向目标对象,表明已经获得这个对象的锁了。解锁,就是上述过程的反向操作。当然,这些操作是CAS方式进行的。
重量级锁
重量级锁是彻底的悲观锁,当一个线程获取某个对象的重量级锁失败时,线程便会阻塞,进入锁定池,等待这个锁被释放。当一个对象的锁变成了重量级锁,mark word便会成为一个指向 Mutex Lock(互斥量)的指针。
同步机制之一--Synchronized,以及此机制下的锁的本质和种类的更多相关文章
- Synchronized机制下偏向锁、轻量级锁、重量级锁的适用场景
上次总结了Synchronized机制下的锁的种类和原理,这次总结一下几种锁的适用场景. 偏向锁 一个线程获取某个对象的偏向锁的成本是很低的,只需把对象头的偏向线程id改为自己就好,如果偏向线程id已 ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
- JVM锁机制之synchronized
概述: synchronized是java用于处理多线程同步的一个关键字,用于标记一个方法/代码块,使之成为同步方法/同步块. 用synchronized可以避免多线程处理时的竞态条件问题. 相关概念 ...
- (转载)JVM实现synchronized的底层机制
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- [转帖]B4. Concurrent JVM 锁机制(synchronized)
B4. Concurrent JVM 锁机制(synchronized) https://www.cnblogs.com/zlxyt/p/11050346.html 挺好的 感觉这个文章写的 不过想要 ...
- 并发编程的锁机制:synchronized和lock
1. 锁的种类 锁的种类有很多,包括:自旋锁.自旋锁的其他种类.阻塞锁.可重入锁.读写锁.互斥锁.悲观锁.乐观锁.公平锁.可重入锁等等,其余就不列出了.我们重点看如下几种:可重入锁.读写锁.可中断锁. ...
- java ->多线程_线程同步、死锁、等待唤醒机制
线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ...
- java面试-synchronized底层实现机制
一.synchronized的三种应用方式 1.修饰实例方法,锁是当前实例对象,进入同步代码前要获得当前实例的锁 /** * synchronized修饰实例方法,当前线程的锁是实例对象account ...
- C#中的WinForm的消息机制简述,及消息机制下Invoke,和BeginInvoke的使用和区别
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...
随机推荐
- [Hei.Captcha] Asp.Net Core 跨平台验证码实现
写在前面 说起来比较丢脸.我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.Net Framework的,使用的包是System.Drawing,我把这验证码绘制逻辑复 ...
- 华为路由交换综合实验 ---IA阶段
目录 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 根据拓扑合理规划IP地址以及VLANIf地址(PC1属于运营部,PC2属于市场 ...
- linux文本编辑vim命令
1.Vim Vim 是一个功能强大的全屏幕文本编辑器,是 Linux/UNIX 上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件. Vim 没有菜单,只有命令 2.Vim 工作模式 3.插入 ...
- 开启java之门
一.Java语言概述 Java语言诞生于1995年,由Sun公司推出. 2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com Ja ...
- HelloDjango 系列教程:Django 的接客之道
文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 Web 服务简单的说就是处理请求,每个请求就像是一个"顾客".首先热情地把顾客迎接进来,然后满足用户的个性 ...
- 控制台出现_ob_:Obsever
我遇到一个问题:我的代码想让他点击之后得到经纬度坐标数组,然后我就这样写了 然而控制台却读取出了
- 图像反转(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...
- 1和new Number(1)有什么区别
1和new Number(1)有什么区别 author: @Tiffanysbear 总结,两者的区别就是原始类型和包装对象的区别. 什么是包装对象 对象Number.String.Boolean分别 ...
- spark shuffle读操作
提出问题 1. shuffle过程的数据是如何传输过来的,是按文件来传输,还是只传输该reduce对应在文件中的那部分数据? 2. shuffle读过程是否有溢出操作?是如何处理的? 3. shuff ...
- java并发编程(十九)----(JUC集合)总体框架介绍
本节我们将继续学习JUC包中的集合类,我们知道jdk中本身自带了一套非线程安全的集合类,我们先温习一下java集合包里面的集合类,然后系统的看一下JUC包里面的集合类到底有什么不同. java集合类 ...