iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java常用锁synchronized和ReentrantLock的区别
  • 184
分享到

Java常用锁synchronized和ReentrantLock的区别

2024-04-02 19:04:59 184人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录区别1:用法不同synchronized 基础使用ReentrantLock 基础使用区别2:获取锁和释放锁方式不同区别3:锁类型不同区别4:响应中断不同区别5:底层实现不同小结

前言:

在 Java 中,常用的锁有两种:synchronized(内置锁)和 ReentrantLock(可重入锁),二者的功效都是相同得,但又有很多不同点,所以我们今天就来聊聊。

区别1:用法不同

synchronized 可用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用在代码块上。

synchronized 基础使用

使用 synchronized 修饰代码块:

public void method() {
    // 加锁代码
    synchronized (this) {
        // ...
    }
}

ReentrantLock 基础使用

ReentrantLock 在使用之前需要先创建 ReentrantLock 对象,然后使用 lock 方法进行加锁,使用完之后再调用 unlock 方法释放锁,具体使用如下:

public class LockExample {
    // 创建锁对象
    private final ReentrantLock lock = new ReentrantLock();
    public void method() {
        // 加锁操作
        lock.lock();
        try {
            // ...
        } finally {
            // 释放锁
            lock.unlock();
        }
    }
}

区别2:获取锁和释放锁方式不同

synchronized 会自动加锁和释放锁,当进入 synchronized 修饰的代码块之后会自动加锁,当离开 synchronized 的代码段之后会自动释放锁,

如下图所示: 

 而 ReentrantLock 需要手动加锁和释放锁如下图所示: 

PS:在使用 ReentrantLock 时要特别小心,unlock 释放锁的操作一定要放在 finally 中,否者有可能会出现锁一直被占用,从而导致其他线程一直阻塞的问题。

区别3:锁类型不同

synchronized 属于非公平锁,而 ReentrantLock 既可以是公平锁也可以是非公平锁。

 默认情况下 ReentrantLock 为非公平锁,这点查看源码可知: 

 使用 new ReentrantLock(true) 可以创建公平锁,查看源码可知:

区别4:响应中断不同

ReentrantLock 可以使用 lockInterruptibly 获取锁并响应中断指令,而 synchronized 不能响应中断,也就是如果发生了死锁,使用 synchronized 会一直等待下去,而使用 ReentrantLock 可以响应中断并释放锁,从而解决死锁的问题,比如以下 ReentrantLock 响应中断的示例:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockInterrupt {
    static Lock lockA = new ReentrantLock();
    static Lock lockB = new ReentrantLock();
    public static void main(String[] args) throws InterruptedException {
        // 线程 1:先获取 lockA 再获取 lockB
        Thread t1 = new Thread(() -> {
            try {
                // 先获取 LockA
                lockA.lockInterruptibly();
                // 休眠 10 毫秒
                TimeUnit.MILLISECONDS.sleep(100);
                // 获取 LockB
                lockB.lockInterruptibly();
            } catch (InterruptedException e) {
                System.out.println("响应中断指令");
            } finally {
                // 释放锁
                lockA.unlock();
                lockB.unlock();
                System.out.println("线程 1 执行完成。");
            }
        });
        // 线程 2:先获取 lockB 再获取 lockA
        Thread t2 = new Thread(() -> {
            try {
                // 先获取 LockB
                lockB.lockInterruptibly();
                // 休眠 10 毫秒
                TimeUnit.MILLISECONDS.sleep(100);
                // 获取 LockA
                lockA.lockInterruptibly();
            } catch (InterruptedException e) {
                System.out.println("响应中断指令");
            } finally {
                // 释放锁
                lockB.unlock();
                lockA.unlock();
                System.out.println("线程 2 执行完成。");
            }
        });
        t1.start();
        t2.start();
        TimeUnit.SECONDS.sleep(1);
        // 线程1:执行中断
        t1.interrupt();
    }
}

以上程序的执行结果如下所示: 

区别5:底层实现不同

synchronized 是 JVM 层面通过监视器(Monitor)实现的,而 ReentrantLock 是通过 AQS(AbstractQueuedSynchronizer)程序级别的 API 实现。 synchronized 通过监视器实现,可通过观察编译后的字节码得出结论,

如下图所示: 

 其中 monitorenter 表示进入监视器,相当于加锁操作,而 monitorexit 表示退出监视器,相当于释放锁的操作。 ReentrantLock 是通过 AQS 实现,可通过观察 ReentrantLock 的源码得出结论,核心实现源码如下: 

小结

synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁,二者的主要区别有以下 5 个:

  • 用法不同:synchronized 可以用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用于代码块。
  • 获取锁和释放锁的机制不同:synchronized 是自动加锁和释放锁的,而 ReentrantLock 需要手动加锁和释放锁。
  • 锁类型不同:synchronized 是非公平锁,而 ReentrantLock 默认为非公平锁,也可以手动指定为公平锁。
  • 响应中断不同:ReentrantLock 可以响应中断,解决死锁的问题,而 synchronized 不能响应中断。
  • 底层实现不同:synchronized 是 JVM 层面通过监视器实现的,而 ReentrantLock 是基于 AQS 实现的。

到此这篇关于Java常用锁synchronized和ReentrantLock的区别的文章就介绍到这了,更多相关Java 锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java常用锁synchronized和ReentrantLock的区别

本文链接: https://www.lsjlt.com/news/148245.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java常用锁synchronized和ReentrantLock的区别
    目录区别1:用法不同synchronized 基础使用ReentrantLock 基础使用区别2:获取锁和释放锁方式不同区别3:锁类型不同区别4:响应中断不同区别5:底层实现不同小结...
    99+
    2024-04-02
  • 在java中synchronized和ReentrantLock区别是什么
    java中synchronized和ReentrantLock区别:synchronized是关键字,而ReentrantLock是类。ReentrantLock比synchronized更灵活。ReentrantLock可以对获取锁的等待...
    99+
    2024-04-02
  • Synchronized 和 ReentrantLock 的实现原理及区别
    目录前言考点分析知识扩展ReentrantLock 源码分析JDK 1.6 锁优化自适应自旋锁锁升级总结前言 在 JDK 1.5 之前共享对象的协调机制只有 synchro...
    99+
    2024-04-02
  • Synchronized 与 ReentrantLock 的区别是什么
    这篇文章将为大家详细讲解有关Synchronized 与 ReentrantLock 的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。可重入性:从名字上理解,ReenTrantLo...
    99+
    2023-06-19
  • 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
    synchronized 和 Reentrantlock多线程编程中,当代码需要同步时我们会用到锁。Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式。显式锁是JDK1.5引入的,这两种...
    99+
    2023-05-30
    java 内置锁 synchronized
  • 关于synchronized、volatile、ReentrantLock的区别与对比
    目录并发编程特性volatile特性:作用的地方:synchronized特性作用的地方修饰方法,分为实例方法和静态方法修饰代码块ReentrantLock特性作用的地方做为成员变量...
    99+
    2023-05-16
    java synchronized java volatile java ReentrantLock java 同步
  • 浅谈synchronized加锁this和class的区别
    目录synchronized 用法1.加锁 class 共享一个类实例2.加锁 class 创建多个实例3.加锁 this 共享一个类实例4.加锁 this 创建多个类实例总结syn...
    99+
    2024-04-02
  • synchronized加锁this和class的区别是什么
    本篇内容介绍了“synchronized加锁this和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!synchroni...
    99+
    2023-06-21
  • synchronized和Lock的区别
    一、基础操作的区别 synchronized:在Java中,synchronized是内置的关键字,它能够保证在同一时刻非常多只有一个线程执行该段代码,以实现对共享资源的同步访问。当一个线程进入synchronized声明的同步代码块...
    99+
    2023-10-29
    区别 synchronized Lock
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2024-04-02
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • java中volatile和synchronized的区别与联系
    java中volatile和synchronized的区别与联系这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两...
    99+
    2023-05-31
    volatile synchronized ava
  • Java中volatile和synchronized区别是什么?
    不懂Java中volatile和synchronized区别是什么??其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。volatile是变量修饰符,而synchronized则是作用于一段代...
    99+
    2023-05-31
    java volatile synchronized
  • 在java中synchronized和volatile的区别是什么
    java中synchronized和volatile的区别:volatile仅能使用在变量级别,而synchronized则可以使用在变量、方法、和类级别的。synchronized会线程阻塞,volatile不会造成线程阻塞。synchr...
    99+
    2024-04-02
  • 在java中synchronized和Lock有什么区别
    在java中synchronized和Lock的区别:1.lock是接口,而synchronized是关键字2.synchronized无法判断是否获取锁的状态,而Lock可以判断。3.synchronized在发生异常时候会自动释放占有的...
    99+
    2024-04-02
  • 详解Java中的锁Lock和synchronized
    目录一、Lock接口1、Lock接口和synchronized内置锁2、lock接口使用的一般形式3、Lock接口的方法4、相比于synchronized,Lock接口所具备的其他特...
    99+
    2024-04-02
  • Java AQS中ReentrantLock条件锁的使用
    目录一.什么是AQS1.定义2.特性3.属性4.资源共享方式5.两种队列6.队列节点状态7.实现方法二.等待队列1.同步等待队列2.条件等待队列三.condition接口四.Reen...
    99+
    2023-02-02
    Java ReentrantLock条件锁 Java ReentrantLock Java条件锁
  • volatile和synchronized的区别是什么
    本篇文章给大家分享的是有关volatile和synchronized的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 内存模型(JMM)CPU 增加了缓存均衡...
    99+
    2023-06-16
  • Java Synchronized锁的使用详解
    目录Synchronized的用法同步示例方法同步静态方法同步代码块Synchronized的用法 在多线程并发问题中,常用Synchronized锁解决问题。Synchronize...
    99+
    2022-11-13
    Java Synchronized锁使用 Java Synchronized锁 Java Synchronized
  • ​​​​​​​Java公平锁和非公平锁的区别
    目录正文应用场景公平和非公平锁代码演示执行流程分析公平锁执行流程非公平锁执行流程优缺点分析总结前言: 从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁。但公平锁和非...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作