深入理解重量级锁—synchronized

本文详细介绍了Java中synchronized的原理、特性及其保证的可见性、原子性和有序性。从Java内存模型(JMM)出发,阐述了synchronized如何确保并发安全,包括其可重入性、不可中断性,以及轻量级锁、偏向锁的优化策略。此外,还讨论了wait-notify机制的工作原理。
摘要由CSDN通过智能技术生成

目录

一、可见性、原子性、有序性

二、Java内存模型(JMM)

三、synchronized保证三大特性

四、synchronized的特性

五、synchronized原理

六、synchronized优化原理

七、Wait—notify()


一、可见性、原子性、有序性

可见性:

概念:(多个线程竞争)一个线程对共享变量的修改,其他线程立即得到修改后的最新值;

常见问题:在并发编程过程中,当一个线程对共享变量进行了修改,而其他线程并没有读取到该共享变量修改过后的值;

原子性:

概念:(多个线程竞争)原子性是指操作是不可分割的。若一条或多条指令具备原子性,那么这些指令要么全部执行且不会受其他因素干扰而中断,要么全都不执行。

常见问题:当一个线程对共享变量操作到一半时,另外的线程也有可能对共享变量进行操作,从而干扰了前一个线程的操作,影响最终结果。

有序性:

概念:(多个线程竞争)指程序中代码的执行顺序。Java会在编译和运行时对代码进行优化,导致程序最终的代码执行顺序可能不一定与我们所编写的代码执行顺序一致。

二、Java内存模型(JMM)

计算机结构:

缓存:

  • CPU中包含L1、L2、L3 三级缓存,L3为多个CPU核心共享的缓存;

  • 序号越小,越接近CPU,速度越快,容量越小;

  • Cache(缓存)出现的目的是为了解决CPU直接访问内存效率低下的问题,程序在运行过程中,CPU接收到指令后,它会最先向CPU中的一级缓存(L1 Cache)寻找相关数据,若命中缓存,CPU进行计算时就可以直接对CPU Cache中的数据进行访问,当运算结束后,再讲CPU Cache中的最新数据刷新到主内存中,CPU通过直接访问Cache的方式替代直接访问主内存,极大地提高了CPU的吞吐能力。但由于一级缓存(L1 Cache)容量较小,所以不可能每次都命中。此时CPU就会继续向下层二级缓存(L2 Cache)寻找,同理若仍未找到,则会在第三层的L3 Cache(多核共享缓存中)、内存(主存)、硬盘中寻找。

Java内存模型:

概念:

  • Java内存模型(Java Memory Model),是Java虚拟机规范中所定义的一种模型,Java内存模型是标准化的,屏蔽掉了底层硬件以及不同的操作系统;

  • Java内存模型是一套规范,描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节:

    • 主内存:所有线程共享的区域,各个线程均能够对其进行访问;所有的共享变量都存储于主内存中;

    • 工作内存:每个线程都拥有一个自己的工作内存,工作内存只存储‘主内存中共享变量的副本’。线程对变量的所有操作(读写)都必须在工作内存中完成,而不能直接对主内存中的变量进行操作,不同线程之间也无法访问对方工作内存中的变量。

如上图:

作用:Java内存模型是一套在多线程读写共享数据时,对共享数据的可见性、有序性、原子性的规则和保障;(synchronized、volatile)

CPU缓存、内存 与 Java内存模型的关系:

  • 对于计算机硬件内存在寄存器、缓存、内存等概念,并无工作内存和主内存之分,即Java内存模型对内存的划分对硬件内存并无任何影响,因为JMM是一组抽象概念,不论是JMM中的‘工作内存’还是‘主内存’中的数据,对于计算机硬件来说既可能存在于寄存器,也可能存在于缓存,同样也可能存在于硬件内存中。因此总体而言,Java内存模型和计算机硬件内存架构是一个交叉的关系,一种抽象概念化分与真实物理硬件的交叉。

小结:Java内存模型(JMM)是一套规范,描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节,Java内存模型是对共享数据可见性、有序性、原子性的规则和保障。

主内存与工作内存之间的交互

Java内存模型中定义了8中操作用于完成主内存与工作内存之间具体的数据交互,即一个变量:主内存->工作内存(拷贝)、工作内存—>主内存(同步)之类的实现细节,虚拟机在实现时,须保证这8中操作都是原子的、不可再分的。

流程如下图:

  • 执行Lock时,若工作内存中已经存在中内存中某个共享变量的副本以及数据值,则在执行Lock操作前会先将工作内存中该变量副本的数据值清空,然后重新获取主内存该变量的值,再执行Lock操作。

  • 在执行Unlock时,会先将工作内存中的数据值同步回主内存中,再执行Unlock操作。

大致流程:Lock -> Read -> Load -> Use -> Assign -> Store -> Write -> Unlock

三、synchronized保证三大特性

原子性:

synchronized能够保证同一时刻最多只有一个线程执行该段代码,已达到保证并发安全的效果。

synchronized(obj){ ... }

原理:synchronized保证对象锁只能被一个线程拿到进入同步代码块内,在该线程释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值