Java并发之synchronized
Java多线程同步关键词是常用的多线程同步手段。它可以修饰静态类方法,实例方法,或代码块。修饰static静态方法时是对整个类加锁。
一、实现原理
在JVM中对象内存分三块区域,对象头、实例数据、对齐填充数据。Java对象头是实现synchronize锁对象的基础,它使用的锁对象就是存储在Java对象头里。JVM中用2个字节存储对象头,主要结构是由Mark Word和Class Metadata Address 组成,前者MarkWord里存储对象的hashcode、锁信息、分代年龄、GC标志等信息,后者存放类型指针,指向对象的类元数据。
从字节码可知synchronized代码块的实现用的是mmonitorenter和monitorexit指令,synchronized方法同步是隐式同步,JVM从方法常量池中的方法表结构中的ACC_SYNCHRONIZED访问标志区分一个方法是否是同步方法。
二、JVM锁优化
JAVA6后JVM对同步关键词进行优化,引入偏向锁、自旋锁、轻量级锁等概念。对象头中锁状态有无锁状态、偏向锁、轻量级锁和重量级锁。
JVM在JIT编译时通过上下文扫描,会去除不可能存在共享资源竞争的锁,减少没必要的请求锁时间,比如方法内StringBuffer对象调用append时,JVM会自动将其消除。
JAVA6 默认引入了偏向锁,如果一个线程获取了锁,则锁就进入偏向模式,此时Mark Word的结构也从无锁状态变为偏向锁结构,当这个线程再请求锁时无需做申请锁等相关操作。如果每次申请锁的线程都不相同则不应该用偏向锁。
偏向锁失败后会先升级为轻量级锁,此时对象头Mark Word结构变为轻量级锁结构,适应线程交替执行同步块的场合,轻量级锁使用的依据是“对大部分锁,在整个同步周期内都不存在竞争”。如果存在同一时间访问同一锁的情况,轻量级锁就会失败。
轻量级锁失败后虚拟机为了避免线程真实的在操作系统层面挂起,会进行自旋锁优化手段。它基于大多数情况下线程持有锁的时间都不会太长,JVM让想要获取锁的线程做一会儿空循环如果得到锁就进入临界区,如果失败就在操作层面挂起,升级为重量级锁。
Java并发之synchronized的更多相关文章
- 深入理解Java并发之synchronized实现原理
深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...
- Java并发之synchronized关键字深度解析(二)
前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...
- 《提升能力,涨薪可待》—Java并发之Synchronized
Synchronized简介 线程安全是并发编程中的至关重要的,造成线程安全问题的主要原因: 临界资源, 存在共享数据 多线程共同操作共享数据 而Java关键字synchronized,为多线程场景下 ...
- Java并发之Synchronized机制详解
带着问题阅读 1.Synchronized如何使用,加锁的粒度分别是什么 2.Synchronized的实现机制是什么 3.Synchronized是公平锁吗 4.Java对Synchronized做 ...
- Java并发之synchronized关键字深度解析(一)
前言 近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹cow之谈资.本小系列为并发之亲儿子-独臂狂侠synchronize ...
- Java并发之synchronized关键字
上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型的问题,针对它们,synchronize ...
- Java并发之synchronized深入
一句话总结synchronized: JVM会自动通过使用monitor来加锁和解锁,保证了同时只有一个线程可以执行指定代码,从而保证了线程安全,同时具有可重入和不可中断的性质. 一.synchron ...
- Java并发之synchronized使用
synchronized,是Java语言的关键字,读['siŋkrənaizd],当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.Java为何要使用sy ...
- java并发之synchronized详解
前言 多个线程访问同一个类的synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了类java的内置锁, 即锁住的是方法所属对象本身. 同 ...
随机推荐
- 第七讲_图像描述(图说)Image Captioning
第七讲_图像描述(图说)Image Captioning 本章结构 递归神经网络 时序后向传播(BPTT) 朴素Vanilla-RNN 基本模型 用sigmoid存在严重的梯度消失 LSTM长短时记忆 ...
- 深入理解vue路由的使用
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应 ...
- 上传图片/文件到server
package yao.camera.util; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; impo ...
- Phpstorm 放大字体的快捷键是什么?
这个功能需要设置才能使用: 步骤:control+shift+A功能可以搜索对应功能 输入mouse 设置Change font size(Zoom) ...的按钮打开,然后就可以通过 ctrl+ ...
- react 获取 input 的值
1.通过 onChange -- e.target.value class App extends Component { state = { username: '张三' }; // 用户名 get ...
- Cocos2d-X中的粒子
Cocos2d-x引擎提供了强大的type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/particle-s ...
- CareerCup之1.6 Rotate Image
[题目] 原文: 1.6 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, ...
- Lombok简介
Lombok简介 和其他语言相比,Java经常因为不必要的冗长被批评.Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,从而有助于保持你的代码整洁.较少的模板意味着更简洁的代码, ...
- ubuntu 下的中文输入法的安装和配置- ibus
ibus输入法 Chinese语言包安装 首先需要给Ubuntu16.04安装Chinese语言包支持. 如上图点击其中的Install/Remove Languages…,这个对话框是通过syst ...
- sublime 实用快捷键
Command+Enter 在下一行插入新行.举个栗子:即使光标不在行尾,也能快速向下插入一行. Command+Shift+Enter 在上一行插入新行.举个栗子:即使光标不在行首,也能快速向上插入 ...