从synchronized入手看锁

JSAPI微信支付(小程序)V3版本JAVA代码实战源码 1.1、商户通过JSAPI/小程序下单接口获取到发起支付的必要参数prepay_id后,再通过微信小程序调起微信支付收银台JSAPI/小程序下单_JSAPI支付|微信支付商户文档中心1.3、微信H5发起类似,结合文档,细微调整,前端返回类似,参考文档修改为微信内置浏览器调起支付即可。 阅读详情

从synchronized入手看锁

synchronized基础描述

修饰在方法上,锁的是当前对象,创建多个对象,则锁失效
此时可以用单例、静态方法锁等方法避免

对象实例在JVM中的状态

一个java对象在内存中分为对象头、实例数据、对其三个部分
对象头:8个字节,垃圾回收数据(分代年龄、GC标志)、锁数据、hashcode值等,一部分存放对象的类元数据,通过该数据确定对象是哪个类的实例。
实例数据:声明的变量和方法,包括父类的属性信息
对齐:用于尾部补齐字节数,使字节对齐。

锁的不同状态

JDK6之前只有两个状态:无锁、有锁(重量级锁),

JDK6之后对synchronized进行了优化,新增了两种状态,总共就是四个状态:

  1. 无锁状态
  2. 偏向锁
  3. 轻量级锁
  4. 重量级锁

锁膨胀

无锁——>偏向锁——>轻量级锁——>重量级锁,并且膨胀方向不可逆。
在这里插入图片描述
在这里插入图片描述

偏向锁

偏向锁的作用:减少同一线程获取锁的代价。锁是为了防止多线程竞争的情况发生,但是在大多数情况下,锁不存在多线程竞争,总是由同一线程多次获得,那么此时就是偏向锁。

核心思想:如果一个线程获得了锁,那么锁就进入偏向模式,对象头结构变为偏向锁结构,记录了该线程的ID,当该线程再次请求锁时,无需再做任何同步操作,只需检查对象头的锁标记为偏向锁且线程ID相同即可,这样就节省了开销。

注意:偏向锁是被动锁,只有当其他线程竞争时,持有偏向锁的线程才会释放锁,或者等待系统在全局安全点(没有字节码正在执行的时候),暂停又有偏向锁的线程,然后检查持有偏向锁的线程是否还活着,如果没有,则释放锁

轻量级锁

轻量级锁是由偏向锁升级而来,当存在第二个线程申请同一个锁对象的时候,偏向锁会升级为轻量级锁。注意第二个线程只是申请锁,而不是竞争锁。

重量级锁

重量级锁是由轻量级锁升级而来,当同一时间有多个线程竞争锁时,锁就会被升级为重量级锁,此时器申请锁的开销也就变大,重量级锁一般使用场景会在追求吞吐量,同步课或者同步方法执行时间较长的场景。

锁消除

锁消除是虚拟机对锁的一种优化,在JIT编译时,对运行上下文进行扫描,去除不可能存在竞争的锁

锁粗化

锁粗化是虚拟机对另一种极端情况的优化处理,通过扩大锁的范围,避免反复加锁和释放锁。

自旋锁与自适应自旋锁

自旋锁:许多情况下,共享数据的锁定状态持续时间较短,切换线程不值得,通过让线程执行循环等待锁的释放,不让出CPU。如果得到锁,就顺利进入临界区。如果还不能获得锁,那就会将线程在操作系统层面挂起,这就是自旋锁的优化方式。但是它也存在缺点:如果锁被其他线程长时间占用,一直不释放CPU,会带来许多的性能开销。

自适应自旋锁:这种相当于是对上面自旋锁优化方式的进一步优化,它的自旋的次数不再固定,其自旋的次数由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定,这就解决了自旋锁带来的缺点。

synchronized与Lock

synchronized的缺点

  1. 无法判断锁状态
  2. 不可中断,如果锁被其他线程占用,当前线程迟迟拿不到一把锁,会出现此案城一直等待
  3. synchronized是非公平锁,排队的线程和新进来的线程获取锁的机会是一样的
  4. 通过monitor关键字获取锁和释放锁,中间不可控
  5. 当锁产生竞争时,会升级为重量锁,有系统进行分配,会从用户空间切换到内核空间

volatile

  1. 防止重排序
  2. 实现可见性
  3. 保证原子性

DCL(Double Check Lock)单例的问题

new 一个对象,在寄存器级别,分为3个步骤:

  000b: new-instance v0, Singleton // type@0000
  000d: invoke-direct {v0}, Singleton.<init>:()V // method@0000
  0010: sput-object v0, Singleton.singleton:LSingleton; // field@0000
  1. new-instance 申请一块内存,创建对象头
  2. invoke-direct 写入对象实例数据
  3. 将创建的对象和引用关联起来

其中 3 依赖于 1,但2和3中间不存在依赖关系,对于不存在依赖关系的指令,在编译器级别执行顺序可能发生变化,这种现象我们称之为指令重排序

指令重排序

计算机执行指令的顺序在经过程序编译器编译之后行程的指令序列
一般而言,指令序列是会输出确定的结果,以确保每一次的执行都有确定的结果
但是,CPU和编译器为了提升程序执行的效率,会按照一定的规则(单线程情况下,改变指令的先后顺序并不会影响最终的结果,那么就允许指令重排序)允许进行指令优化,这种优化就是指令重排序
指令优化的都是互相不依赖的指令,一般在单线程的时候,这种优化并不会发生问题
但是在并发执行的情况下,就可能发生二义性,得到不同的结果。

volatile是如何防止重排序的

可见性:volatile关键字修饰后,所有的操作都是在内存屏障(主内存)中,主内存是被所有线程所共享的,代价就是牺牲了性能,无法利用高速缓冲区。

volatile不能用于并发,只对读写等操作做到原子性

CAS

CAS(Compare and Swap),翻译过来就是比较并交换

CAS机制中使用了三个基本数据:
内存地址V
旧的预期值A
要修改的新值B

更新一个变量的时候,只有当变量的预期值A和内存地址中V中的实际值相同时,才会将V中的值更新为B
如果在更新的之后发现V中的值与预期值不同,说明有其他线程操作了该数据,会从内存中重新读取数据,并重新操作。

CAS机制中的ABA问题

ABA问题:CAS机制中,只判断了预期值是否相等,那么就会存在一个问题,比如一个int值,初始10,预期为10,在比较的时候,被其他线程修改为11后又修改为10了,那么此时判断初始值和预期值就是相等的,这就是ABA问题。
避免:使用AtomicStampedReference包装一下,该类里边增加了一个基本数据,修改时候的时间戳,每次修改的时候判断一下预期值和修改时间,如果有一个不同,就认为是被其他线程修改过了,会重新读取内存进行操作。

ReentrantLock

优点:可重入、可中断、可限时、公平锁

可重入:同一个线程可以反复得到同一把锁,lock和unlock方法需要成对出现。
可中断:与synchronized不同的是,reentrantLock可以通过中断来处理死锁问题
可限时:超时不能获得锁,就返回false,不会永久等待构成死锁。使用lock.tryLock(long timeout, TimeUnit unit)来实现可限时锁,参数为时间和单位。
公平锁:synchronized是非公平锁,ReentrantLock可以通过构造函数初始化一个公平锁,保证先来的可以先得到锁。

隐性锁与显性锁

隐性锁:每个Java对象可以用作实现同步的内置锁,线程在访问同步代码块的时候必须先获取该内置锁,在退出和中断的时候需要释放内置锁。Java内置锁通过synchronized关键字来使用,使用其修饰方法或者代码块,对象锁和类锁(static方法和class上加锁)不冲突,可以并行存在。
显性锁:如ReentrantLock这种,通过手动来加锁和释放锁的方式

乐观锁和悲观锁

悲观锁:是一种独占锁,synchronized就是悲观锁,会导致其他所有未持有锁的线程阻塞,等待持有锁的线程释放锁。
乐观锁:乐观锁就是假设没有冲突而去完成某项操作,如果操作过程中失败了,那么就重试,直到成功为止。例如CAS机制。

并发三大利器

synchronized:应用monitor机制
atomic包:例:atomicBoolean,原理:应用Volatitle关键字和CAS理论实现并发
lock包:应用CAS理论实现并发

cadence17.4和16.6同时安装无法使用的问题 经过对报错的问题分析,发现还是17.4的lic文件和16.6的不一样,16.6的版本总是无法找到自己对应的lic文件。卸载了,重新单独安装16.6,这里就是正确的。包括使用这些工具去修复这些问题,都无法接近。已经放弃了,使用哪个版本就安装 哪个版本。这个也无法解决问题。 阅读详情

相关推荐

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4674

线程同步机制synchronized中锁的判断以及锁的作用范围

当我们使用多个线程访问同一资源(可以是同一个变量、同一个文件、同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题。 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了**同步机制(synchronized)**来解决。 为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制。那么怎么去使用呢?...

qq_40583885的博客 1917

基于ROS的室内移动机器人自主导航技术

随着机器人技术的发展,近些年来室内移动机器人的研究热度越来越高。本文主要利用ROS操作系统对室内移动机器人的建图定位与自主导航关键技术进行研究。 ROS是目前开发较为完整具有广阔应用前景的开源机器人操作系统,具有分布式、模块化、代码复用等优良特点。同时ROS还提供了许多开源库,在这些库的基础之上研究同时定位与地图构建和机器人自主导航技术可以节省大量时间。 ORB-SLAM2是比较优秀的视觉SLAM算法之一,它具有计算量比较小、能够实时运行等优点。在介绍ORB-SLAM2的框架之前,首先会介绍视觉SLAM的一

weixin_44553616的博客 1909

synchronized 中4种锁状态

synchronized锁状态

tealala的博客 1472

LeGO-LOAM相对LOAM的改进---地面分离的方法-算法原理+代码讲解

实际上此种地⾯分离算法有⼀些简单,我们可以结合激光雷达安装⾼度等其他先验信息进⾏优化,避免将桌子这些当作地面点。LeGO-LOAM中前端改进中很重要的⼀点就是充分利⽤了地⾯点,那⾸先⾃然是提取对地⾯点的提取。理想情况下, 应该接近0,考虑到⼀⽅⾯激光雷达安装也⽆法做到绝对⽔平,另⼀⽅⾯,地⾯也不是绝。对⽔平,因此,这个⾓度会略微⼤于0,考虑到作者实际在草坪之类的场景下运动,因此这个值被设置成。如上图,相邻的两个扫描线束的同⼀列打在地⾯上如AB点所⽰,他们的垂直⾼度差。,计算垂直⾼度差和⽔平⾼度差的⾓度。..

zysss_的博客 775

STM32F407ZGT6开发板跑马灯实战:从原理图到烧录全流程(附FlyMcu配置)

本文以正点原子F4探索者开发板(STM32F407ZGT6)为例,手把手指导完成跑马灯实验。内容涵盖从原理图解读、GPIO驱动逻辑分析、HAL库工程搭建,到代码编写与FlyMcu串口烧录配置的全流程,帮助嵌入式开发新手快速实现第一个LED控制程序,打通软硬件开发链路。

weixin_29183637的博客 223

通过反编译查看程序中synchronized锁的加锁解锁过程

反编译查看程序中synchronized锁

jikeyeka的博客 482

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 147

Java锁机制之synchronized

java中2种锁的实现原理区别: synchronized: 在软件层面依赖JVM,在jvm将class文件编译成字节码文件时添加monitorenter和monitorexit句柄来区分加锁代码块 Lock: 在硬件层面依赖特殊的CPU指令。 synchronized机制: 首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个非空对象都可以作为一个锁。 synchronized关键字锁具体表现为:锁对象和锁对象的class类;每个类可以有很多实例对象,不同实例对象的对象锁互不干扰,但

wenhonglian的博客 3672

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

Rust 在数据科学家中的普及将受到 Polars 的推动,用户会发现从使用 Python 切换到 Rust API 的门槛相对较低——比从 Pandas 切换到 C 的门槛要低得多!在数据科学蓬勃发展的十年里,我所在领域的日常工作主要由像 Python 这样的动态语言或像 R 和 Julia 这样使用即时编译的语言主导。尽管这两个库的功能有很多重叠,但有些人会想要一个像 DuckDB 这样的工具,它拥有更多关系型数据库的陷阱,而有些人则不会。然而,一位受访者正确地指出,基于GPU的库(如cuDF)更快。

sosogod的博客 2466

单细胞多组学数据整合分析实战:从原始数据到跨平台合并

本文详细介绍了单细胞多组学数据整合分析的实战流程,从原始数据处理到跨平台合并分析。通过Seurat和Harmony等工具的应用,帮助研究者有效解决批次效应问题,保留真实的生物学信号。文章包含代码示例和常见问题解决方案,特别适合需要进行单细胞合并分析的研究人员参考。

weixin_30752699的博客 90

面试题精讲系列之锁-synchronized与Lock锁

锁分类 Java锁分类 分类标准 分类 根据线程是否需要对资源加锁 悲观锁/乐观锁 根据多个线程是否能获取同一把锁 共享锁/独享(独占、排他)锁 根据锁是否能够重复获取 可重入锁/不可重入锁 根据锁的公平性进行区分 公平锁/非公平锁 当多个线程并发访问资源时,当使用synchronized时 锁升级(偏向锁/轻量级锁/重量级锁) 根据资源被锁定后,线程是否阻塞 自旋锁/适应性自旋锁 悲观锁 VS 乐观锁 首先我们来看看悲观锁与乐观锁。 其实这里无论是悲观锁还是乐观锁,都

liuerchong的博客 1978

本地部署DeepSeek并搭建量化交易系统:完整指南

本地部署DeepSeek并搭建量化交易系统指南 本文提供了一套完整的本地部署DeepSeek大语言模型并构建量化交易系统的技术方案。系统包含以下核心组件: 环境配置:详细说明Ubuntu系统、NVIDIA显卡驱动、CUDA和Python环境的安装要求,推荐使用conda管理依赖 DeepSeek部署: 通过HuggingFace下载7B或13B量化版本模型 使用4-bit量化技术降低显存需求 封装为FastAPI服务提供推理接口 量化系统架构: 模块化设计,各组件通过Redis解耦 包含数据获取、因子计算、

huanghm88的专栏 477

从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁

在学习ReentrantLock之前,我们先来复习一下如下的几类锁的定义,这个其实很早的博文中就已经详细的整理过了,这里为了更好理解ReentrantLock锁,还是简单罗列一下。

JavaBuild的博客 991

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM对synchronized的优化——锁膨胀

文章目录Java对synchronized的优化——锁膨胀前言锁标志位锁膨胀的流程 Java对synchronized的优化——锁膨胀 前言 通常我们在synchronized(…)中传一个对象,即可实现加锁,非常简单。而使用锁,常见的问题就是效率慢。在较早期的Java中synchronized会直接调用系统的重量级互斥锁(monitor)来实现加锁,效率较慢。锁膨胀则是针对该问题的优化方案:由...

蒋含竹的博客 2380

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

synchronized的使用 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 我们先来看一段简单的代码 public class SynchronizedTest { private static Object object = new Object(); public static void main(String[] args) { synchronized (objec

m0_64867003的博客 374

synchronized锁的升级机制:从偏向锁到重量级锁

锁升级机制偏向锁:适用于单线程场景,几乎无开销轻量级锁:适用于轻微竞争,使用CAS和自旋重量级锁:适用于激烈竞争,线程阻塞等待性能优化策略减少锁持有时间:将耗时操作移出临界区减少锁粒度:使用细粒度锁或锁分段读写分离:使用ReadWriteLock无锁编程:使用并发集合类监控与诊断使用JVM工具(jstack、jconsole)程序化监控线程竞争分析锁竞争热点锁类型适用场景性能特点开销偏向锁单线程重复获取极高性能几乎无开销轻量级锁轻微竞争,短暂持有高性能CAS + 自旋开销。

m0_62910542的博客 1009

密码锁 java接口_从synchronized和lock区别入手聊聊java锁机制

写这篇文章之前,我去百度了一下啥叫锁,百度百科上写道:置于可启闭的器物上,以钥匙或暗码开启。确实我们一般理解的锁就是门锁,密码锁,但是在计算机科学中,锁又是啥,说实话,这个问题我也思考了很久,也没法很好的用一两句话就让人听得明白,也不想有人看到我的文章,然后将我的结论当作答案,我觉得最好的答案还是在探索的过程中得到的,接下来我们就好好探索一番。作为一名java程序员,最开始接触到的锁就是synch...

weixin_30052271的博客 263

java膨胀法_Java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

原标题:Java架构之路(多线程)synchronized详解以及锁的膨胀升级过程synchronized是jvm内部的一把隐式锁,一切的加锁和解锁过程是由jvm虚拟机来控制的,不需要我们认为的干预,我们大致从了解锁,到synchronized的使用,到锁的膨胀升级过程三个角度来说一下synchronized。锁的分类java中我们听到很多的锁,什么显示锁,隐式锁,公平锁,重入锁等等,下面我来总结...

weixin_39545805的博客 117

java 偏向锁 重偏向_【学习底层原理系列】Java底层-synchronized锁-2偏向锁篇

上一篇通过构建金字塔结构,来从不同的角度,由浅入深的对synchronized关键字做了介绍,本文将从底层实现的各个“组件”着手,详细拆解其工作原理。本文会分为以下2节内容:第一节:介绍MarkWord和LockRecord两种数据结构,该知识点是理解synchronized关键字底层原理的关键。第二节:分析偏向锁加锁解锁时机和过程一.先来了解两种数据结构,你应该了解这些知识点1.MarkWord...

weixin_31773159的博客 857

java语言中的锁

从java的集合线程安全开始说起 平时经常使用的集合类如ArrayList,LinkedList,HashSet等以及Map都是线程不安全的,如果进行多线程操作会出现线程安全问题,那么java是如何解决这些常用类的线程安全问题呢 几个常用的保证集合类线程安全的方法 使用synchronized关键字 使用Collections提供的工具方法保证线程安全,底层还是使用Synchr...

骐骏的专栏 180

深入分析 synchronized 的实现原理

http://www.iocoder.cn/JUC/sike/synchronized/ 记得刚刚开始学习 Java 的时候,一遇到多线程情况就是 synchronized ,相对于当时的我们来说 synchronized 是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。 但是,随着我们学习的进行我们知道 synchronized 是一个重...

Java_Jsp_Ssh的博客 603

synchronized底层实现原理及锁优化

一、概述 1、synchronized作用 原子性:synchronized保证语句块内操作是原子的 可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现) 有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”) 2、synchronized的使用 修饰实例方法,对当前实例对象加锁 修饰...

Medlen 7万+

synchronized锁,ReentrantLock 锁

(如程序计数器、栈指针、通用寄存器值等)到内存(通常是内核栈),再加载内核态的上下文。这个过程涉及多次内存读写(内存速度比 CPU 寄存器慢 100 倍以上),且需要严格保证操作的原子性(避免数据错乱),硬件层面的指令执行成本很高。切换时,CPU 必须保存当前用户态的。

chaodddddd的博客 1482

Synchronized锁、锁的四种状态、锁的升级(偏向锁,轻量级锁,重量级锁)

Synchronized【对象锁】采用互斤的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。synchronized方法和synchronized块。

m0_64422133的博客 3648

synchronized锁升级

如果锁获取成功,直接替换Mark Word中的线程ID为B自己的ID(A → B),重新偏向于其他线程( 即将偏向锁交给其他线程,相当于当前线程" 被"释放了锁),该锁会保持偏向锁状态,A线程Over,B线程上位。如果锁获取失败,则偏向锁升级为轻量级锁,此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁。(4). 假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。此时线程B操作中有两种情况。

weixin_50823701的博客 1986

Synchronized锁详解

Synchronized锁详解

lixiangchibang的博客 5091
上一篇: Android内存相关补充
下一篇: 数据结构之ArrayList
gitzzp
博客等级 码龄11年 307粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值