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的内置锁, 即锁住的是方法所属对象本身. 同 ...
随机推荐
- OpenCV学习教程入门篇<一、介绍>
OpenCV,是Inter公司开发的免费开源专门因为图像处理和机器视觉的C/C++库,英文全称是Open Source Computer Vision. 1. 可视化语言Matlab与OpenCV都能 ...
- source insight的查找功能
source insight是一款非常好的c语言的程序编辑器.方便对project管理,方便程序的阅读和编辑. 查找功能使用十分频繁.选项较多,与其他软件的查找功能也类似,以下对英文版的查找功能,做简 ...
- Sales Team 仪表盘
实际设定值 仪表定义 <div class="oe_center" t-if="record.invoiced_ta ...
- (二)MVVMLight 关联View和ViewModel
在我们按照(一)中的步骤,安装好MMVLight的环境后, 会多出一个文件夹ViewModel,里面有两个.cs文件MainViewModel.cs和ViewModelLocator.cs MainV ...
- ListView中button监听器 设置 及 优化
在应用开发中常常会用到ListView,而且每个Item里面都会有button之类的须要进行事件监听的控件.在给button加入OnClickListener的时候,一開始非常下意识的会想在ListV ...
- python(27)- 面向对象练习Ⅰ
一:定义如下类,并最大程度地重用代码(继承,派生:子类重用父类方法,组合) 老师类 学生类 分数类 课程类 生日类 class People: def __init__(self,name,age,b ...
- 为什么应使用 Node.js
为什么应使用 Node.js JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScrip ...
- Spring学习【Spring概述】
从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架. 当中採用IoC原理实现的基于Java Beans的配置管理和AOP的思想都是非常值得学习与使用的.以下 ...
- MOS简单应用
高端功率开关驱动的原理非常简单,和低端功率开关驱动相对应,就是负载一端和开关管相连,另外一端直接接地.正常情况下,没有控制信号的时候,开关管不导通,负载中没有电流流过,即负载处于断电状态:反之,如果控 ...
- systemd、upstart和system V
http://blog.csdn.net/kumu_linux/article/details/7653802 systemd是Linux下的一种init软件,由Lennart Poettering ...