首页 > 其他分享 >Synchronized的底层实现原理(转载)

Synchronized的底层实现原理(转载)

时间:2024-03-22 14:23:33浏览次数:24  
标签:Synchronized synchronized 对象 monitor 线程 JVM 转载 Monitor 底层

synchronized
一. synchronized解读

1.1 简单描述
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是同步,也称之为同步锁。
synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。

1.2 特性
原子性:synchronized保证语句块内操作是原子的
同步方法
ACC_SYNCHRONIZED 这是一个同步标识,对应的 16 进制值是 0x0020
这 10 个线程进入这个方法时,都会判断是否有此标识,然后开始竞争 Monitor
对象。

同步代码
 monitorenter,在判断拥有同步标识 ACC_SYNCHRONIZED 抢先进入此方法
的线程会优先拥有 Monitor 的 owner ,此时计数器 +1。
 monitorexit,当执行完退出后,计数器 -1,归 0 后被其他进入的线程获得。

可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)
那么为什么添加 synchronized 也能保证变量的可见性呢?
因为:

线程解锁前,必须把共享变量的最新值刷新到主内存中。
线程加锁前,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存
中重新读取最新的值。
volatile 的可见性都是通过内存屏障(Memnory Barrier)来实现的。
synchronized 靠操作系统内核的Mutex Lock(互斥锁)实现,相当于 JMM 中的 lock、unlock。退出代码块时刷新变量到主内存。
有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)
as-if-serial,保证不管编译器和处理器为了性能优化会如何进行指令重排序,
都需要保证单线程下的运行结果的正确性。也就是常说的:如果在本线程内观察,
所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序
的。
这里有一段双重检验锁(Double-checked Locking)的经典案例:

public class SingletonDoubleCheckLock {

private SingletonDoubleCheckLock(){}

private volatile static SingletonDoubleCheckLock instance;

public SingletonDoubleCheckLock getInstance(){
    if (null == instance){
        synchronized (SingletonDoubleCheckLock.class){
            if (null == instance){
                instance = new SingletonDoubleCheckLock();
            }
        }
    }
    return instance;
}

为什么,synchronized 也有可见性的特点,还需要 volatile 关键字?
因为,synchronized 的有序性,不是 volatile 的防止指令重排序。那如果不加 volatile 关键字可能导致的结果,就是第一个线程在初始化初始化对象,设置 instance 指向内存地址时。第二个线程进入时,有指令重排。在判断 if (instance == null) 时就会有出错的可能,因为这会可能 instance 可能还没有初始化成功。

重入性:synchronized 是可重入锁,也就是说,允许一个线程二次请求自己持有对象锁
的临界资源,这种情况称为可重入锁

标签:Synchronized,synchronized,对象,monitor,线程,JVM,转载,Monitor,底层
From: https://www.cnblogs.com/libin2015/p/18089380

相关文章

  • Android 底层问题日志记录
    上电日志ddr异常(ddr内存-->内存是其它硬件与CPU进行沟通的桥梁)(220817_11:21:48.229)[dramc]DRAM_FATAL_ERR_FLAG=0x80000020(220817_11:21:48.229)[dramc]fataldramexceptionfound!resetsystem..(220817_11:22:25.531)Pllinitstart...PLL(PhaseLockedLoop......
  • 悄悄分享几个极品网站,低调 工具 转载
    AI生成图片在线免费使用文生图模型SDXL 实时生成图片,效果超群。  ZLibrary之前分享的地址又更新了全网电子书都在这了:ZLibrary官方通道来了,不再担心找不到最新地址,配合这个脚本简直完美  朋友圈文案上传图片,立即生成20字左右的朋友圈文案。  古龙小说全集......
  • ConcurrentHashMap底层详解
    ConcurrentHashMap是线程安全且高效的HashMap。一、使用原因在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于此产生了ConcurrentHashMap。1.线程不安全的HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率......
  • linux 调度器学习 转载;
    转载:http://www.wowotech.net/process_management/scheduler-history.html转载:O(n)、O(1)和CFS调度器任务调度器是操作系统一个很重要的部件,它的主要功能就是把系统中的task调度到各个CPU上去执行满足如下的性能需求:1、对于time-sharing的进程,调度器必须是公平的2、快速的进程......
  • 【Linux】内核学习笔记(八)——网络栈简介 转载
    转载:https://void-star.icu/archives/601网络栈从定义上还比较抽象。不过从功能上看,它是为了让主机之间交换数据而生的。要实现网络栈,最原始的一个方式就是:将想发送的报文封装成帧,然后发出去就完事了。接收主机会按约定好的方式解析。不过这种存在一个问题,如果要加密怎么办?要支......
  • 玩转TypeScript-基础(转载)
    转载自:https://www.cnblogs.com/alexander3714/p/14268982.htmlPart1内容#安装typescript编译器#全局安装:npminstall-gtypescript在命令行中查看ts编译器版本判断是否安装成功。TypeScript文件默认以.ts为后缀,TypeScript是JavaScript的扩展,所以TypeScript代码要......
  • golang 多返回值的实现原理-转载
    之前一次面试时,面试官问到你知道golang的多返回值的实现吗,一脸懵逼,平时主要注重项目应用开发,对这块确实没关注,答得不好,各位大佬,以后建议也加强下基础哦。今天看看golang中多返回值的实现。可以简单认为c中多返回值的实现,其实就是通过寄存器将返回参数以指针形式传入传入参......
  • 游戏汉化时使用的像素字体(转载)
    原文链接https://zhuanlan.zhihu.com/p/573922877警告:我想你应该知道大多数字体需要商业授权。如果是商业汉化需要使用像素字体,请注意对应字体授权范围和商用条件。很多中文像素字体溯源困难,本文中列举的授权情况基本为推断,不代表实际情况。稍微介绍一下一般游戏汉化时使用的。......
  • C++ 引用底层解析
    1.引用的底层原理解析引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理解,并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。引用地址空间存放的是被引用对象的地址。实际上,引用本身是一个变量,......
  • socket 技术是干什么的?底层原理是什么?
    Socket技术是一种通信机制,用于实现不同计算机之间的网络通信和同一计算机内不同进程之间的进程间通信。它是一种抽象层,使得不同操作系统和编程语言的程序能够在网络上相互通信。底层原理方面,Socket技术基于网络协议栈和操作系统提供的网络编程接口。当程序使用Socket技术......