jdk 1.6 synchronized 偏向锁

news/2024/5/17 15:21:50 标签: synchronized

Hotspot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。偏向锁的意思是如果一个线程获得了一个偏向锁,如果在接下来的一段时间中没有其他线程来竞争锁,那么持有偏向锁的线程再次进入或者退出同一个同步代码块,不需要再次进行抢占锁和释放锁的操作。

偏向锁可以通过 -XX:+UseBiasedLocking开启或者关闭

“偏向”的意思是,偏向锁假定将来只有第一个申请锁的线程会使用锁(不会有任何线程再来申请锁),因此,只需要在Mark Word中CAS记录owner(本质上也是更新,但初始值为空),如果记录成功,则偏向锁获取成功,记录锁状态为偏向锁,以后当前线程等于owner就可以零成本的直接获得锁;否则,说明有其他线程竞争,膨胀为轻量级锁。
在这里插入图片描述

偏向锁获取流程

流程说明 :

  1. 访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01——确认为可偏向状态。
  2. 如果为可偏向状态,则测试线程ID是否指向当前线程,如果是,进入步骤(5),否则进入步骤(3)。
  3. 如果线程ID并未指向当前线程,则通过CAS操作竞争锁。如果竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行(5);如果竞争失败,执行(4)
  4. 如果CAS获取偏向锁失败,则表示有竞争。当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。
  5. 执行同步代码。

http://www.niftyadmin.cn/n/1281660.html

相关文章

Mac HomeBrew安装慢解决方案(转)

网速尚可,可使用此方法官网安装Homebrew /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”网速慢处理方案 先获取install文件 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/ins…

OEA框架学习:使用动软代码生成器

一、摘要 没事玩玩,哈。有感兴趣的可以去玩玩。 二、本文大纲 a、摘要 。 b、动软介绍 。 c、动软模板 。 三、动软介绍 大家直接去看官网就可以了哈,地址了,在这呢。http://www.maticsoft.com/default.htm 这里就不细说了吧。 四、动软模…

深入理解单例模式:静态内部类单例原理

首先我们要先了解下单例的四大原则: 构造私有。以静态方法或者枚举返回实例。确保实例只有一个,尤其是多线程环境。确保反序列换时不会重新构建对象。 我们常用的单例模式有: 饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式…

快速学习-Flume快速入门

第2章 快速入门 2.1 Flume安装地址 Flume官网地址 http://flume.apache.org/文档查看地址 http://flume.apache.org/FlumeUserGuide.html下载地址 http://archive.apache.org/dist/flume/ 2.2 安装部署 将apache-flume-1.7.0-bin.tar.gz上传到linux的/opt/software目录下解…

springboot之jackson的两种配置方式

springboot 针对jackson是自动化配置的,如果需要修改,有两种方式: 方式一:通过application.yml 配置属性说明:## spring.jackson.date-format指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体…

应用程序 数据缓存

///<summary>///通过单利模式 实现数据程序缓存 ///DataInstanct.GetInstan().Add(0)[写入数据] ///DataInstanct.GetInstan().Clear()[清空数据存储] ///</summary>public class DataInstance{ ///<summary>///数据仓库 ///</summary&…

快速学习-Flume高级之自定义MySQLSource

第5章 Flume高级之自定义MySQLSource 5.1 自定义Source说明 Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据&#xff0c;包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。…

中华石杉视频笔记

《21天java进阶面试训练营》的笔记存放地址&#xff1a; 训练营笔记放在公众号【狸猫技术窝】的官方GitHub仓库&#xff1a; https://github.com/shishan100/Java-Interview-Advanced