Synchronized锁

2023-05-16

1、Synchronized基本特性回顾

  应用场景:多线程环境下保证线程的安全性。
  使用方式:
    1)Synchronized加在普通方法上,使用的是this锁,也就是当前对象
    2)Synchronized加在静态方法上,使用的是class字节码作为锁
    3)Synchronized加在代码块,可以以任何对象作为锁
       Synchronized锁会关联一个对象 monitor对象
  Synchronized是一个Java关键字  Java对象 转 C代码 转 汇编。

2、Synchronized monitor对象源码解读

  每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针。
        Synchronized的锁对象的对象头中的Mark Word会关联一个monitor对象。这个monitor对象不是我们主动创建的,是JVM的线程执行到这个同步代码块,发现锁对象没有monitor就会创建monitor,monitor内部有两个重要的成员变量:
  【owner】记录拥有这把锁的线程;
  【recursions】记录线程拥有锁的次数(重入次数、递归次数)。
    当一个线程拥有monitor后其他线程只能等待
  【_EntryList】锁池。锁的竞争过程中,一旦有线程抢锁成功,其他线程会存放在_EntryList中,处于等待阻塞状态。竞争锁失败的会存放在这里阻塞等待。
    (当锁释放之后,唤醒锁池中的线程)
  【_cxq】竞争,所有线程都没有拿到锁的情况下,通过单向链表的形式存放参与竞争的线程。一旦有线程抢锁成功,其他线程会存放在_EntryList中。
  【_WaitSet】等待池。等待池中的线程不会去竞争锁资源。通过锁对象的.wait方法,当前线程释放所持的锁,且变为阻塞状态存放到_WaitSet;调用notify方法时,取出一个在_WaitSet中等待的线程,放入到_EntryList中(并未唤醒)。notify方法所谓的唤醒线程只是将线程转移到_EntryList中,并未真正唤醒。

3、Synchronized对象布局分析

对象头16个字节:
  MarkWord     对象自身的运行时数据 :存放hashcode、GC分代、锁状态标记、持有的锁线程、偏向锁线程 ID等  8个字节。  
  Class Point    指向实例的引用                                                    8个字节
实例数据(成员变量 ):
  private int userId;  //4个字节
对齐填充数据:
  由于HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,也就是对象的大小必须是8字节的整数倍。
  当对象头加上实例数据的字节数不是8的倍数,需要通过对齐填充来补全。

4、new 一个对象占用多少个字节?

  对象头16个字节(未压缩)+实例数据(int四个字节,boolean1个字节)+填充数据(凑8的倍数)。  

5、Synchronized锁的升级过程  

5.1偏向锁:(jdk6开始优化)

  定义:只有一个线程重复使用的时候产生,通过判断减少CAS过程。(适用于一个线程)
  优点:没有锁的竞争,提高锁的效率。
  过程
  ① 线程t1检查Java对象头中是否有关联当前线程。
  ② 如果没有的情况下,使用CAS修改MarkWord,标记为当前线程t1。
  ③ 如果使用CAS修改成功,获取锁;如果修改失败,则说明当前MarkWord已经被其他线程修改过,获取锁失败。
  ④ 如果使用CAS修改MarkWord成功,MarkWord标记为当前线程,同时修改MarkWord中偏向锁标记为1。
  偏向锁撤销:如果线程一直持有偏向锁,突然有另一个线程开始竞争java锁对象,这时偏向锁会开始撤销。撤销之后有可能会改为轻量锁或重量锁。

5.2 轻量锁

  定义:当多个线程在间隔的方式竞争我们的锁对象,短暂结合自旋控制。
  栈帧:方法的执行空间
  过程
  T线程会复制对锁象头中markword(gc分代、hashcode)到栈帧空间,使用CAS修改锁对象的markword(非复制过来的markword)指针关联到该线程的栈帧空间地址,修改成功执行同步代码;修改失败则自旋,自旋多次升级为重量级锁。
  为甚么要升级到重量级锁?    因为自旋非常消耗内存

5.3 重量锁:

  只要有一个线程获取到锁,其他线程都会变为阻塞状态。效率非常低。

6、、偏向锁、轻量级锁、自旋锁、重量级锁过程

  偏向锁:只有一个线程的情况下,可以使用轻量级减少CAS加锁和释放锁的操作。如果多个线程同时访问,偏向锁会撤销为轻量锁或重量锁。
  轻量锁:多个线程间隔或短暂竞争锁的情况下。不会导致当前线程阻塞,没有获取到锁的线程会采用自旋的形式重复获取锁,但是非常消耗内存,如果多次重复获取锁,则升级为重量锁。
    应用场景:同步代码块里的代码执行时间是非常快的情况下。
  重量锁:没有获取到锁的线程会变为阻塞状态,效率是极低。
    应用场景:线程不会采用自旋的形式,不会消耗CPU资源,释放CPU执行权,同步代码块执行可能比较耗时,其他线程在自旋过程中仍未执行完同步代码块。

7、Synchronized锁的使用需要注意哪些优化问题

1)减少Synchronized同步的范围,减少同步代码块执行的时间,只会使用到偏向锁或轻量锁;
2)将锁的粒度拆分得更细;
  类似Conhashmap底层实现原理 降低锁的粒度
3)锁一定要做读写分离,只是读的操作不需要加锁;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Synchronized锁 的相关文章

  • 多线程(十)多线程编程示例

    文章目录 一 交替输出1A2B3C4D5E 1 1 synchronized wait notify 1 2 Condition await signal 二 生产者 消费者问题 2 1 synchronized wait notify 2
  • java多线程实战( 多个线程 修改同一个变量)

    java多线程实战 多个线程 修改同一个变量 synchronized 同步 介绍 java多线程实战 需求 创建两个线程 分别输出 a b 要求输出总和为30个 线程介绍 一 定义线程 1 扩展java lang Thread类 此类中有
  • 详解Java锁对象

    1 Synchronized 1 1 synchronized特性 1 互斥 synchronized会起到互斥效果 某个线程执行到某个对象的synchronized中时 其他线程如果也执行到同一个对象synchronized就会阻塞等待
  • Lock 接口与 synchronized 关键字的区别

    拷贝别的博主总结的9点不同 1 JDK版本不同 synchronized关键字产生于JKD1 5之前 是低版本保证共享资源同步访问的主要技术 Lock接口产生于JDK1 5版本 位于著名的java util concurrent并发包中 是
  • synchronized、volatile底层原理详解

    文章目录 一 synchronized 1 监视器Monitor monitor结构及原理 监视器Monitor有两种同步方式 互斥与协作 2 Mutex lock mutex的工作方式 3 java对象头 java对象布局 4 无锁 偏向
  • Java多线程编程基础篇(二)-多线程同步关键字

    一 多线程同步关键字 synchronized 1 概念 synchronized保证方法或者代码块在运行时 同一时刻只有一个方法可以进入到临界区 同时它还可以保证共享变量的内存可见性 当多个并发线程访问同一个对象object中的同步代码块
  • 使用什么原语来实现同步关键字?

    当我们使用synchronizedjava中的关键字 究竟使用哪个同步原语 Lock Semaphore Monitor Mutex EDIT JVM如何在本机级别实现锁 在字节码级别 java有monitorenter and monit
  • 为什么Java构造函数不能同步?

    根据Java语言规范 http java sun com docs books jls third edition html classes html 8 8 3 构造函数不能标记为同步 因为在创建该对象的线程完成之前 其他线程无法看到正在
  • 易失性数组的替代方案

    从其他问题中 我了解到易失性数组的元素不是易失性的 只有引用本身是不稳定的 volatile int data Thread A data 4 457 Thread B System out println data 4 在这里 线程 B
  • 我是否应该同步监听器通知?

    我总是很犹豫是否要把我的锁公开 公开 我总是尝试将锁限制在我的实现范围内 我相信 不这样做就会导致僵局 我有以下课程 class SomeClass protected ArrayList
  • 学习Java,synchronized关键字的使用

    所以我正在测试synchronized关键词 这是我尝试过的一个例子 public class MyTest static int i 0 public static void main String args new Thread t1
  • 线程安全与同步

    我是java新手 我对线程安全和同步有点困惑 线程安全意味着一个方法或类实例可以被多个线程同时使用而不会出现任何问题 其中 同步意味着单个时间只能有一个线程运行 那么它们之间有何关系呢 线程安全的定义在Java 并发实践 http amzn
  • Java的happens-before和同步

    我对 Java 有一点不同意见发生在之前和同步 想象一下以下场景 主线程 MyObject o new MyObject 0 synchronized sharedMonitor 1 add the object to a shared c
  • 同步块——锁定多个对象

    我正在建模一个游戏 其中多个玩家 线程 同时移动 玩家当前所在位置的信息被存储两次 玩家有一个变量 hostField 它引用棋盘上的一个字段 每个字段都有一个 ArrayList 存储当前位于该字段的玩家 我对拥有冗余信息这一事实不太满意
  • Java 同步引用

    我有A级和B级 public class A private static List
  • java 数组列表上的易失性/同步

    我的程序如下所示 public class Main private static ArrayList
  • pthread_mutex_t VS @synchronized 块?

    static pthread mutex t gLock global pthread mutex init gLock NULL in init pthread mutex lock gLock for int i 0 i lt mess
  • 为什么抽象方法不能同步?

    我正在读一本来自 CodeRanch 的线程 http www coderanch com t 455033 java programmer SCJP certification abstract synchronized methods
  • 为什么 java 中 wait/notify/notifyAll 方法不同步?

    在Java中 每当我们需要调用wait notify notifyAll时 我们都需要访问对象监视器 通过synchronized方法或通过synchronized块 所以我的问题是为什么java不采用同步等待 通知方法来消除从同步块或方法
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom

随机推荐

  • LL(1)文法的语法分析java实现

    java代码如下 xff1a package 文法分析器 import java io BufferedReader import java io FileInputStream import java io InputStreamRead
  • CSDN,我的良师益友

    鲁迅曾说过 xff1a 不是缺乏天才 xff0c 而是缺乏培养天才的土壤 对于中国的 IT 行业来说 xff0c 从来不缺乏技术英雄 xff0c 缺少的是铸就技术英雄的平台 而 CSDN 就给了我们这样一个平台和机会 xff0c 所以我们是
  • 构造中小型园区网实训案例

    构造中小型园区网实训案例 一 实验工具与实验拓扑规划1 实验工具2 实验拓扑 二 需求分析三 数据规划四 实施步骤步骤1 xff1a 配置所有终端步骤2 xff1a 配置所有接入层交换机步骤3 xff1a 配置网关路由器AR1 公网路由器A
  • 软件工程复习

    第一章 xff1a 课程概述 1 1 软件危机 1 1 1 计算机软件的四个发展阶段 程序设计阶段 程序系统阶段 软件工程阶段 面向对象阶段 1 1 2 什么是软件危机 xff08 考点 xff09 软件危机是指在计算机软件的开发和维护过程
  • ArrayDeque底层实现

    一 什么是ArrayDeque 1 Deque与Queue 了解这个之前 xff0c 我们要先知道什么是Deque xff0c 它和Queue有什么区别 xff1a 在java中 xff0c Queue被定义成单端队列使用 xff0c De
  • Hive知识点汇总

    HIVE 一 Hive的优化 数据倾斜 xff1a shuffle之后Key的分布不均导致分配到Reduce端的数据不均匀 xff0c 出现个别Reduce的数据过大 xff0c 执行时间过长而出现的现象 1 数据倾斜产生的原因 xff1a
  • CentOS7安装与克隆

    CentOS7安装与克隆 一 新建虚拟机及其配置二 配置虚拟网络编辑器三 安装CentOS 7四 一些工具的安装五 虚拟机克隆六 虚拟机克隆后的配置七 配置ssh免密登陆八 批处理脚本与集群分发脚本1 将家目录配置进环境变量2 批处理脚本3
  • NGINX ./configure详解

    在 34 configure 34 配置中 xff0c with 34 表示启用模块 xff0c 也就是说这些模块在编译时不会自动构建 without 34 表示禁用模块 xff0c 也就是说这些模块在编译时会自动构建 xff0c 若你想N
  • Linux下Nginx安装使用

    一 下载解压nginx span class token comment 进入要放安装包的目录 span span class token builtin class name cd span opt software span class
  • java Collections类 详解

    目录 一 前言 二 Collections类简介 三 Collections类常用方法演示 1 static void reverse List list 代码演示 2 static void shuffle List list 代码演示
  • Activity onNewIntent注意事项

    数据上报发现 xff0c onNewIntent 以后 xff0c onResume和onPause可能不会执行 xff0c 直接执行onStop
  • Python+OpenCV实用案例应用教程:人脸检测和识别

    计算机视觉使很多任务成为现实 xff0c 其中两项任务就是人脸检测 xff08 在图像中定位人脸 xff09 和人脸识别 xff08 将人脸识别为特定的人 xff09 OpenCV实现了一些人脸检测和识别的算法 从安全到娱乐 xff0c 这
  • 基数排序 详细讲解

    1 基数排序 桶排序 介绍 基数排序 xff08 radix sort xff09 属于 分配式排序 xff08 distribution sort xff09 xff0c 又称 桶子法 xff08 bucket sort xff09 或b
  • CentOS7安装docker后服务启动不了

    问题排查 运行yum install docker后 xff0c 安装完成docker 运行 docker info 命令测试docker是否正常 则提示以下错误 xff1a Cannot connect to the Docker dae
  • Linux命令+shell脚本大全:处理损坏的包依赖关系

    有时在安装多个软件包时 xff0c 某个包的软件依赖关系可能会被另一个包的安装覆盖掉 这叫作 损坏的包依赖关系 xff08 broken dependency xff09 如果系统出现了这个问题 xff0c 先试试下面的命令 xff1a y
  • 世界上最简单的无锁哈希表

    英文原文 xff1a preshing xff0c 感谢 64 浅水清流 的热心翻译 如果其他朋友也有不错的原创或译文 xff0c 可以尝试推荐给伯乐在线 以下是译文 无锁哈希表 xff08 Lock Free Hash Table xff
  • nginx ssl及http自动跳转到https配置

    1 Nginx路径配置 如下请求地址 http x x x x 8080 api base test 此时 zo java这个应用接收到的地址是 xff1a http x x x x 8080 api base test location
  • 视图绑定.

    在大多数情况下 xff0c 视图绑定会替代 findViewById 视图绑定功能可按模块启用 要在某个模块中启用视图绑定 xff0c 请将 viewBinding 元素添加到其 build gradle 文件中 xff0c 如下例所示 x
  • 优秀程序员的故事

    A君默默的工作了3年 xff0c 从项目初立 xff0c 到遍地开花 工作不忙 xff0c 工资没长 新领导来了 xff0c 下个版本重新开发 xff0c A君继续维护老版本 新招了一批人 xff0c 加班加点干了半年多 直到版本发布 xf
  • Synchronized锁

    1 Synchronized基本特性回顾 应用场景 xff1a 多线程环境下保证线程的安全性 使用方式 xff1a 1 xff09 Synchronized加在普通方法上 xff0c 使用的是this锁 xff0c 也就是当前对象 2 xf