Java中的关键字--synchronized
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方式,区别和偏向锁、轻量锁和重量锁实现原理。
先看看synchronized关键字的4种用法。
1、修饰普通方法
private synchronized void synMethod(){
}
这种用法中,synchronized锁的对象实例。
2、修饰静态方法
private static synchronized void synMethod(){
}
synchronized在这种情况下,锁的是当前Class类对象。
3、同步方法块
private void synMethod1(){
synchronized(this){
}
}
private void synMethod2(){
synchronized(ThreadTest.class){
}
}
synMethod1中锁对象实例;synMethod2的是当前Class类对象。
再介绍锁原理
在介绍锁原理之前,先认识一下Java对象头Mark Word,以32位为例。
|
锁状态 |
25 bit |
4bit |
1bit |
2bit |
||
|
|
23bit |
2bit |
是否偏向锁 |
锁标志位 |
||
|
轻量级锁 |
指向栈中锁记录的指针 |
0 |
||||
|
重量级锁 |
指向互斥量(重量级锁)的指针 |
10 |
||||
|
GC标记 |
空 |
11 |
||||
|
偏向锁 |
线程ID |
Epoch |
对象分代年龄 |
1 |
01 |
|
|
无锁 |
对象的hashCode |
对象分代年龄 |
0 |
01 |
||
上面的表格中,描述的是对象在每个锁状态时,对象头中所存储的信息。
1、偏向锁
实际环境中,线程在访问同步块时,如果没有其他线程对锁进行竞争,并且由同一个线程多次获得锁,也就是单线程运行同步代码,在这种情况下,若是每次还阻塞线程,就代表白白浪费CPU性能。这种情况下,引入了偏向锁概念。

- 访问同步代码块
- 判断对象头Mark Word中存储的线程ID是否指向当前线程,如果是,则表明当前是锁的重入,不需要再获得锁,直接执行同步代码
- 如果不是,则尝试使用CAS算法将线程ID更新至对象头中。
- 成功,获得锁,执行同步代码。更新失败表明存在锁竞争,等待全局安全点,暂停拥有偏向锁的线程,根据对象头的锁标志位,选择将偏向锁升级为轻量锁或者置为无锁。
可以使用-XX:-userBiasedLocking=false来关闭JVM偏向锁优化,默认直接进入轻量锁。
2、轻量锁

- 访问同步代码块时,先在当前线程的线程栈中创建一个锁记录(Lock Record)区域。
- 把对象头Mark Word拷贝到Lock Record中。
- 利用CAS尝试将对象头Mark Word中的线程指针更新为指向当前线程的指针
- 更新成功,则获得轻量锁。
- 更新失败,检查Mark Word中的指针是否指向当前线程。
- 如果是,则说明是锁的重入现象。执行同步代码块
- 如果不是,则说明此时存在竞争。需要把轻量锁膨胀为重量锁。
3、重量锁
重量锁是基于对象监视器(Monitor)来实现的。

线程在执行同步代码时,需要调用一个Monitor.enter指令。执行退出后,调用Monitor.exit指令。这里看得出,监视器具有排它性,一个时间点只能有一个线程enter成功,其他线程只能阻塞在队列中。所以这种重量锁的操作成本很高。
Java中的关键字--synchronized的更多相关文章
- Java中的关键字synchronized
1. 介绍 在Java并发系列的文章中,这个是第二篇文章.在前面的一篇文章中,我们学习了Java中的Executor池和Excutors的各种类别. 在这篇文章中,我们会学习synchronized关 ...
- 【转】java中volatile关键字的含义
java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- Java中Volatile关键字详解
一.基本概念 先补充一下概念:Java并发中的可见性与原子性 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值, ...
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- java中volatile关键字的理解
一.基本概念 Java 内存模型中的可见性.原子性和有序性.可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有 ...
- Java中Volatile关键字详解(转载)
转载自:https://www.cnblogs.com/zhengbin/p/5654805.html 一.基本概念 先补充一下概念:Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性是 ...
- Java中Volatile关键字详解 (转自郑州的文武)
java中volatile关键字的含义:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 一.基本概念 先补充一下概念:J ...
- 【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?
写在前面 在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是 ...
- Java 中的关键字
Java 中有多少个关键字,有大小写之分吗? Java 中有 48 个关键字在使用 + 两个保留关键字未使用,共 50 个关键字. Java 关键字全部都由是小写组成. Java 中保留关键字分别是哪 ...
随机推荐
- re模块 时间模块
# 正则模块'''正则就是用一些具有特殊含义的符号组合到一起用来描述字符或字符串的方法或者说,正则就是用来描述一类事物的规则它内嵌在python中,并通过re模块实现正则表达式模式被编译成一系列的字节 ...
- Django组件---Django请求生命周期和中间件
Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...
- Task1.数据集探索
中文数据集THUCNews:https://pan.baidu.com/s/1hugrfRu 密码:qfud 参考:https://blog.csdn.net/SMith7412/article/de ...
- Netty模型
- 继续写高精!noip2012国王游戏。。。
国王游戏 题目描述: 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- 深圳市利汇电子商务科技有限公司2019年java面试笔试题
垃圾公司,建议不要去,写的地址去了发现是两个公司公用一个办公场地,还没有公司的招牌,去了交简历给前台然后就是 填一份求职申请,一份笔试题如下,然后就等待,先是人事的一个小妹妹面试,问一些个人问题,为什 ...
- (3.1)狄泰软件学院C++课程学习剖析二
深度剖析C++第二部分 1.通过对象名能够访问public成员变量.每个对象的成员变量都是专属的,成员变量不能够在对象之间共享. 2.需求:统计在程序运行期间某个类的对象数目,保证程序的安全性(不能使 ...
- 20180910-Java 文档注释
Java 文档注释 Java只是三种注释方式.前两种分别是// 和/* */,第三种被称作说明注释,它以/** 开始,以 */结束. // /* */ /** */ 说明注释允许你在程序中嵌入关于程序 ...
- php面试专题---22、网站优化 总结
php面试专题---22.网站优化 总结 一.总结 一句话总结: 主要从前端.后端.数据库.资源四个方面开始发散 前端浏览器缓存和数据压缩前端优化(减少HTTP请求次数) 资源流量优化(防盗链处理)C ...
- 10 Advanced Bing Search Tricks You Should Know
Exclude Websites From Bing Search: wikipedia -wikipedia.org Excluding Keywords From Bing Search: fac ...