java中的锁:synchronized与ReentrantLock

【面试真题拆解】Java锁机制:synchronized、ReentrantLock、锁升级、可重入锁 一句话速通:Java 锁机制核心是 synchronized 和 ReentrantLock,两者都是可重入锁;JDK 1.6+ 后 synchronized 引入锁升级(无锁➡️偏向锁➡️轻量级锁➡️重量级锁),性能大幅提升;简单场景优先用 synchronized,需要高级功能(比如可中断、可超时、公平锁)时用 ReentrantLock。 阅读详情

一、synchronized

1、具体的实现方式有:
A:同步代码块
synchronized(锁旗标/监视哨/任意对象){
	//需要同步的代码块
}

B:同步方法
[访问修饰符] synchronized 方法返回值的数据类型 方法名([参数列表]){
	//需要同步的代码
}
2、同步代码块和同步函数的区别:
  A:语法不同  
  B:同步代码块的锁是任意对象,同步的实例方法使用锁是固定的:this
注:
   同步的实例方法使用的锁是this.  
   同步的静态方法使用的锁是:当前静态方法所在的 类名.class(字节码文件对象)

二、ReentrantLock

1.实例化锁对象
private final Lock lock=new ReentrantLock();
2.根据锁对象获取监视器对象
Condition producer_condition=lock.newCondition();
Condition consumer_condition=lock.newCondition();
3.锁的使用
(1)、让生成者线程使用的方法,完成生产任务
public  void set(String name,char sex){
    //a.获取锁对象
    lock.lock();
    try{
        //判断是否生产过
        while(this.isProduce){
            //b、让当前线程(生产者线程)等待
            producer_condition.await();
        }
        this.name=name;
        this.sex=sex;
        //将是否生产过的标记置为true,表示已经生产过了.
        this.isProduce=true;
        //c、唤醒消费者线程对象
        consumer_condition.signal();
    }finally{
        //d、释放锁
        lock.unlock();
    }
}
(2)、消费者线程完成消费任务时调用的方法
public  void out(){
    //a.获取锁
    lock.lock();
    try{
        //如果没有生产过,则消费者线程等待
        while(!this.isProduce){
            //b、让消费者线程对象
            consumer_condition.await();
        }
        //如果已经消费过了,则将已经生成过的标志置为false,表示没有生成过
        this.isProduce=false;
        //c、唤醒生产者线程对象
        producer_condition.signal();
    }finally{
        //d、释放锁
        lock.unlock();
    }
}
(3)、启动线程
Thread t1=new Thread(new MyRunnable());
Thread t2=new Thread(new MyRunnable());
t1.start();
t2.start();
//强制清除线程的等待状态,并会报异常:InterruptedException
t1.interrupt();
ReentrantLock类的方法
  • getHoldCount() 查询当前线程保持此锁的次数,也就是执行此线程执行lock方法的次数
  • getQueueLength()返回正等待获取此锁的线程估计数,比如启动10个线程,1个线程获得锁,此时返回的是9
  • getWaitQueueLength(Condition condition)返回等待与此锁相关的给定条件的线程估计数。比如10个线程,用同一个condition对象,并且此时这10个线程都执行了condition对象的await方法,那么此时执行此方法返回10
  • hasWaiters(Condition condition)查询是否有线程等待与此锁有关的给定条件(condition),对于指定contidion对象,有多少线程执行了condition.await方法
  • hasQueuedThread(Thread thread)查询给定线程是否等待获取此锁
  • hasQueuedThreads()是否有线程等待此锁
  • isFair()该锁是否公平锁
  • isHeldByCurrentThread() 当前线程是否保持锁锁定,线程的执行lock方法的前后分别是false和true
  • isLock()此锁是否有任意线程占用
  • lockInterruptibly()如果当前线程未被中断,获取锁
  • tryLock()尝试获得锁,仅在调用时锁未被线程占用,获得锁
  • tryLock(long timeout TimeUnit unit)如果锁在给定等待时间内没有被另一个线程保持,则获取该锁
tryLock和lock和lockInterruptibly的区别
  1. tryLock能获得锁就返回true,不能就立即返回false,tryLock(long timeout,TimeUnit unit),可以增加时间限制,如果超过该时间段还没获得锁,返回false
  2. lock能获得锁就返回true,不能的话一直等待获得锁
  3. lock和lockInterruptibly,如果两个线程分别执行这两个方法,但此时中断这两个线程,前者不会抛出异常,而后者会抛出异常
Condition类和Object类
  1. Condition类的awiat方法和Object类的wait方法等效
  2. Condition类的signal方法和Object类的notify方法等效
  3. Condition类的signalAll方法和Object类的notifyAll方法等效Lock的公平锁和非公平锁
  4. ReentrantLock类可以唤醒指定条件的线程,而object的唤醒是随机的
Lock的公平锁和非公平锁
Lock lock=new ReentrantLock(true);//公平锁
Lock lock=new ReentrantLock(false);//非公平锁
  • 公平锁指的是线程获取锁的顺序是按照加锁顺序来的,而非公平锁指的是抢锁机制,先lock的线程不一定先获得锁。
学技术学英文:java各种锁-synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock 1.synchronized 可以放到方法和代码块上,方法和代码块运行完了自动解锁,LockAPI 有lock和unlock方法。 2.synchronized 不支持公平锁(抢占式的),LockAPI 支持公平锁(按排队顺序,先进入队列的先获取锁) 3.synchronized 如果获取不到锁会一直阻塞等待 4. LockAPI 提供了多种策略 lock()会等待,tryLock()加锁成功立即返回true否则返回false ,tryLock(long time, TimeUnit 阅读详情

相关推荐

Java并发锁实战:synchronized、ReentrantLock与读写锁核心解析

在并发编程中,锁机制是保障数据一致性和线程安全的核心技术。其基本原理是通过控制对共享资源的访问顺序,防止多个线程同时修改数据导致状态不一致。从技术价值看,合理的锁选型能显著提升系统吞吐量,降低延迟,是高并发系统性能优化的关键。常见的应用场景包括电商库存扣减、配置中心数据同步、缓存更新等读多写少或高竞争场景。本文聚焦Java中三种主流锁实现:synchronized作为JVM内置的悲观独占锁,提供了简洁的自动管理;ReentrantLock以手动控制著称,支持可中断、超时及公平性策略,适合复杂同步需求;Ree

weixin_31155097的博客 307

retreenlock 原理 java_Java Component.getTreeLock方法代码示例

import java.awt.Component; //导入方法依赖的package包/类/*** Handles focus lost events for any component that's using* this input context.* These events are generated by AWT when the keyboard focus* moves away ...

weixin_32821643的博客 237

157.并发编程(一):基础概念,java线程,管程,synchronized锁,ReentrantLock锁

基础概念,java线程,锁

鹏哥哥Aaa 472

Java并发编程 | 第二篇:ReentrantLock重入锁

首先重入锁用ReentrantLock来实现的,关于重入锁ReentrantLock的几个重要方法: 1、lock():获得锁,如果锁被占用,只能等待 2、lockInterruptibly():获得锁,可以响应中断 3、tryLock():尝试获得锁,如果成功返回true,失败返回false,该方法不等待,立即返回 4、tryLock(long time,TimeUnit unit):设...

w 980

计算机网络之NAT的解释与实验配置

NAT 静态NAT 动态NAT easy_ip NAT服务器映射

爱学习的JackYang的博客 1916

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 798

ReentrantLock原理

ReentrantLock,顾名思义,可重入锁 首先看下源码 实现了Lock类,先基本看下Lock类 lock:获取锁,锁被其他线程占用,那么会等待,直到获取锁 lockInterruptibly:获取锁,但是假如当前线程在等待锁的时候被中断,抛出中断异常 tryLock:尝试获取锁,并立即返回 tryLock:在一定时间范围类尝试获取锁 unLock:释放锁 newCondition:新建一个绑定在当前Lock上的Condition对象,condition表示一个等待状态,获得锁的线程

weixin_39082432的博客 700

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜索“什么是 AI?”会得到数百万条结果,包括不同程度的技术和相关信息。那么,对工程师而言,AI 意味着什么?人们对 AI 的关注主要集中在 AI 模型上,受此影响,工程师会迅速投入 AI 建模的研究。

r1832644594的博客 2812

可重入锁(Reentrant Lock)

可重入锁是指同一个线程在已经获取了锁的情况下,还能再次获取该锁而不会被阻塞。也就是说,当一个线程进入一个被锁保护的代码块时,在这个代码块内如果该线程再次请求获取同一把锁,它能够成功获取,而不会因为已经持有锁而被阻塞,从而避免了死锁的发生。这种锁的重入特性主要是通过记录锁的持有线程和重入次数来实现的。

游戏全栈,技术合作 478

CAN基础知识

CAN基础知识

shouchen1的博客 9145

VisualSFM+MeshLab 三维重建全过程记录

VisualSFM+MeshLab 三维重建全过程记录,从下载到运行出结果,以及其中一些可能出现的小问题。通过这两个软件熟悉一下多目立体视觉重建的流程。

何似莫相逢 3万+

第 3 章 ReentrantLock锁的用法及基本原理(随笔)

1. 锁的一些基本分类公平锁:多个线程申请锁时是相对公平的,在申请锁时如果有其它线程已经占用了锁,则进行排队等待处理(排队先进来的先获取到锁,能够避免线程饥饿)。非公平锁:多个线程申请锁时相对不公平,与公平锁相同,都会存在排队的情况,但对于一个新线程需要获取锁时不是先排队等待,而是先尝试获取锁,不成功时再进入队列排队等待(谁抢到就是谁的,抢不到就排队)。悲观锁:每次更新和读取都加锁,对于读多写少这种场景不利,适用于于写多读少的场景。

weixin_50615803的博客 1667

RK3588开发笔记-5G模块(SIM8200、广和通FM160、移远RM500U)调试笔记

RK3588 CPU提供了丰富的外设接口,本文主要介绍通过usb3.0接口驱动5G模块来实现5g无线数据传输功能。在物联网和边缘计算领域,5G网络支持的高速率、低延时连接为应用带来了更多可能性。RK3588作为一款高性能SoC,适合用于5G联网应用。SIM8200广和通FM160和移远RM500U。在RK3588上调试5G模块可以为设备提供稳定的高速联网能力。本文介绍了如何配置和调试SIM8200、广和通FM160和移远RM500U模块,通过AT指令和QMI/MBIM工具实现5G数据连接。

flypig has a dream! 2669

Java 两把锁:synchronized 与 ReentrantLock

主要总结了java两把锁的知识,过程中设计了cas,aqs等知识,最后在各个环节对比两把锁。

clown20的博客 318

【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

JDK使用时的执行流程: • 开发者视角(需要开发java程序):需要安装JDK a. 首先使用JDK调用Tools&Tool APIs(开发者工具)编写好Java程序--xxx.java b. 再次调用Tools&Tool APIs中的javac.exe(编译程序)来编译.java文件(将java文件编译成字节码.class文件) c. 调用java.exe来启动JRE d. 在JRE上运行JAVA字节码(加载特定的.class文件,调用这个class文件中的main方法

Yaoyao2024的博客 2163

示波器核心参数选型指南:带宽、采样率与嵌入式调试实战

示波器是电子工程师进行信号观测与故障诊断的基础仪器,其性能由带宽、采样率、通道数、存储深度、触发系统和探头特性共同决定。带宽定义高频响应边界,需遵循5倍法则以保障数字信号上升沿测量精度;采样率则依据奈奎斯特定理并结合工程冗余(通常≥2.5×带宽)实现可靠时域重建。二者协同影响信号完整性评估能力,尤其在UART、I²C、SPI等嵌入式总线调试中至关重要。高存储深度支持长时捕获与毛刺定位,智能触发与硬件协议解码进一步将波形分析升维至语义级。本文围绕真实嵌入式场景,解析参数间的耦合关系与典型误用陷阱。

weixin_42588877的博客 91

深入解析:Java 中的锁 —— synchronized 和 ReentrantLock

它维护了一个。

小健学Java的博客 1305

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java并发锁:synchronized与ReentrantLock深度对比

本文深入比较了Java中synchronized和ReentrantLock两种并发控制机制。从实现原理看,synchronized基于JVM内置锁,经历无锁到重量级锁的升级过程;ReentrantLock则基于AQS框架,采用同步队列和条件队列。两者在锁优化策略上各有特点:synchronized提供偏向锁、锁消除等优化,ReentrantLock支持公平性选择和超时获取。高级特性方面,ReentrantLock支持中断机制、超时获取和更灵活的条件变量。性能对比显示,无竞争时synchronized更优,

LTJ_18的博客 759

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java 并发锁的深度博弈:synchronized、volatile与ReentrantLock底层终极解析

本文全面解析Java并发编程三大核心机制:synchronized、volatile和ReentrantLock。synchronized是JVM内置隐式锁,通过monitor监视器实现,JDK1.6后引入锁升级机制优化性能。volatile仅保证变量可见性和禁止指令重排,不提供原子性保证。ReentrantLock是显式可重入锁,功能更灵活但需手动管理。三者关键区别在于:volatile适用于状态标记,synchronized适合简单同步场景,而高并发复杂场景则推荐使用ReentrantLock。

xiaoye220911的博客 315

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java 并发锁详解:synchronized vs ReentrantLock vs volatile(锁升级、AQS、JMM 原理)

本文对比了Java中三种并发机制:synchronized、ReentrantLock和volatile。synchronized是JVM内置锁,支持锁升级(无锁→偏向锁→轻量级锁→重量级锁),适合简单临界区;ReentrantLock基于AQS实现,提供可中断、超时、公平锁等高级功能,但需手动解锁;volatile仅保证可见性和有序性,适用于状态标志。选型需考虑原子性、控制需求等场景特点,生产环境中建议优先使用synchronized,合理控制锁粒度,必要时使用无锁方案。理解原理才能正确选择并发工具。

2401_88179843的博客 231

深入对比:java中Synchronized关键字和ReentrantLock锁的终极对决

Synchronized和ReentrantLock在Java中都是用来控制并发访问共享资源的机制,但它们在获取释放锁的方式、锁的特性以及锁的实现级别等方面存在一些差异。

超级博客 1222

Java锁重入机制:synchronized与ReentrantLock深度解析

锁重入是Java并发编程中的核心概念,指同一线程可重复获取已持有的锁而不会死锁。其实现原理基于对象监视器(Monitor)或AQS框架,通过记录持有线程和重入次数确保线程安全。在递归调用、回调函数等场景中,重入机制能有效避免自我阻塞和死锁风险。synchronized作为JVM内置锁实现简单高效,而ReentrantLock则提供更灵活的公平锁、可中断等高级特性。理解这两种锁的底层实现差异,对开发高性能并发程序至关重要,特别是在处理高竞争资源时,合理选择锁策略能显著提升系统吞吐量。

weixin_29313817的博客 304

Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁

本文介绍了Java中的ReentrantLock可重入互斥锁,对比了它与synchronized的差异。主要内容包括:ReentrantLock需要手动加锁释放,提供超时获取、可中断等待、公平锁和多个Condition等特性;解释了可重入概念(同一线程可多次获取同一锁);对比了两者的功能差异;说明了构造方法和常用API;最后通过线程安全计数器示例演示了ReentrantLock的使用场景。强调在简单同步场景用synchronized,复杂控制需求时再选择ReentrantLock。

tangPHP的博客 205

Java并发秘籍:偏向锁的奥义 —— 为synchronized与ReentrantLock注入灵魂,偏向锁和轻量级锁的转换条件

在Java并发编程的世界里,关键字和是两个非常重要的同步工具。它们为开发者提供了强大的同步机制,确保了多线程环境下的数据一致性。然而,你是否知道,它们背后还有一个神秘的帮手——偏向锁?今天,就让我们一起揭开偏向锁的神秘面纱,探索它如何为和注入灵魂,提升性能,让并发编程更加高效。

赵KK的博客 830

Java并发锁实战:synchronized、ReentrantLock与读写锁深度解析

在并发编程中,锁是协调多线程访问共享资源、保障数据一致性的核心同步机制。其基本原理是通过互斥或特定规则,控制线程对临界区的访问顺序,同时借助内存模型(如Happens-Before规则)解决可见性问题。锁的技术价值在于平衡性能与正确性,提升多核CPU利用率,避免数据竞争和状态不一致。典型的应用场景包括高并发下的计数器、缓存系统、配置中心及生产者-消费者模型等。本文聚焦于Java中三种主流锁实现:内置的synchronized关键字、灵活显式的ReentrantLock以及适用于读多写少场景的Reentran

weixin_42523693的博客 301

JAVA--线程的锁:synchronized与ReentrantLock 的区别和使用场景实例

JAVA–线程的锁:synchronized与ReentrantLock 的区别和使用场景实例 1.说明: synchronized: 是一个关键词,主要是对方法和代码块进行修饰,主要对会引起不安全的线程的进行处理,处理时需要考虑引起不安全的原因是由什么引起的。 对方法修饰:synchronized class 类名{} 对代码块进行修饰:synchronized (变量){代码块} ReentrantLock 对代码块进行修饰,通过上锁和解锁两部来完成对线程的控制,通过try{} 来上锁执行代码块和 fi

飞扬晴雪 865
上一篇: 通过代码动态修改应用图标和应用名
下一篇: Java并发编程:volatile关键字解析
azhoufeng
博客等级 码龄10年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值