高薪程序员必修课-Java中 Synchronized和ReentrantLock有哪些不同?

news2024/10/6 22:26:57

目录

前言

1. 原理和基础

synchronized

ReentrantLock

2. 功能比较

2.1 锁的可重入性

示例:

2.2 锁的公平性

示例:

2.3 锁的中断响应

示例:

2.4 尝试锁定

示例:

2.5 条件变量

示例:

3. 性能比较

4. 使用方式

synchronized

示例:

ReentrantLock

示例:

总结

 ⭐️ 好书推荐


前言

        在Java中,synchronizedReentrantLock 都是用于实现线程同步的工具,但它们在功能和使用上有一些重要的不同。下面从原理、功能和使用方式等方面详细讲解它们的不同之处,并提供相应的示例。

1. 原理和基础

synchronized
  • 原理synchronized 是Java语言级别的关键字,用于实现同步块或同步方法。它是基于JVM实现的,确保同一时间只有一个线程可以执行被 synchronized 修饰的代码块。
  • 锁的获取和释放:线程进入 synchronized 块时获取锁,退出块时自动释放锁。
ReentrantLock
  • 原理ReentrantLock 是Java中的一个显式锁(explicit lock),在 java.util.concurrent.locks 包中。它提供了与 synchronized 类似的基本同步功能,但增加了更多高级功能。
  • 锁的获取和释放:需要手动获取锁和释放锁,提供了更灵活的锁控制。

2. 功能比较

2.1 锁的可重入性
  • synchronized:支持可重入锁,即同一线程可以多次获取同一把锁,而不会被阻塞。
  • ReentrantLock:也支持可重入锁,提供 isHeldByCurrentThread() 方法检查当前线程是否持有锁。
示例:
public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void method() {
        lock.lock();
        try {
            // 代码逻辑
            if (lock.isHeldByCurrentThread()) {
                // 当前线程持有锁
            }
        } finally {
            lock.unlock();
        }
    }
}
2.2 锁的公平性
  • synchronized:非公平锁,无法控制锁的公平性。
  • ReentrantLock:可以创建公平锁或非公平锁。公平锁按请求顺序获取锁,非公平锁可能导致线程饥饿。
示例:
ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
ReentrantLock unfairLock = new ReentrantLock(false); // 非公平锁
2.3 锁的中断响应
  • synchronized:不支持锁的中断,即等待锁的线程不能被中断。
  • ReentrantLock:支持锁的中断,可以在等待锁时响应中断。
示例:
public class InterruptibleLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void method() {
        try {
            lock.lockInterruptibly();
            try {
                // 代码逻辑
            } finally {
                lock.unlock();
            }
        } catch (InterruptedException e) {
            // 处理中断
        }
    }
}
2.4 尝试锁定
  • synchronized:不支持尝试获取锁。
  • ReentrantLock:支持尝试获取锁,可以设定超时时间。
示例:
public class TryLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void method() {
        if (lock.tryLock()) {
            try {
                // 代码逻辑
            } finally {
                lock.unlock();
            }
        } else {
            // 锁未获取
        }
    }

    public void methodWithTimeout() throws InterruptedException {
        if (lock.tryLock(5, TimeUnit.SECONDS)) {
            try {
                // 代码逻辑
            } finally {
                lock.unlock();
            }
        } else {
            // 锁未获取
        }
    }
}
2.5 条件变量
  • synchronized:使用 wait()notify()notifyAll() 方法实现条件等待和通知。
  • ReentrantLock:使用 newCondition() 方法创建条件对象,提供更灵活的等待和通知机制。
示例:
public class ConditionExample {
    private final ReentrantLock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();

    public void awaitMethod() throws InterruptedException {
        lock.lock();
        try {
            condition.await();
        } finally {
            lock.unlock();
        }
    }

    public void signalMethod() {
        lock.lock();
        try {
            condition.signal();
        } finally {
            lock.unlock();
        }
    }
}

3. 性能比较

  • synchronized:在JVM层面进行优化,性能较好。在低争用情况下,与 ReentrantLock 性能相当甚至更优。
  • ReentrantLock:在高争用情况下,性能优于 synchronized,特别是通过公平锁可以减少线程饥饿问题。

4. 使用方式

synchronized
  • 使用 synchronized 关键字修饰方法或代码块。
  • 自动管理锁的获取和释放,简单易用。
示例:
public class SynchronizedExample {
    private final Object lock = new Object();

    public synchronized void synchronizedMethod() {
        // 代码逻辑
    }

    public void synchronizedBlock() {
        synchronized (lock) {
            // 代码逻辑
        }
    }
}
ReentrantLock
  • 显式创建 ReentrantLock 对象,手动管理锁的获取和释放。
  • 提供更多控制和功能,如公平锁、可中断锁、条件变量等。
示例:
public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void lockMethod() {
        lock.lock();
        try {
            // 代码逻辑
        } finally {
            lock.unlock();
        }
    }
}

总结

  • 可重入性:两者都支持。
  • 锁的公平性synchronized 不支持,ReentrantLock 支持。
  • 锁的中断响应synchronized 不支持,ReentrantLock 支持。
  • 尝试锁定synchronized 不支持,ReentrantLock 支持。
  • 条件变量synchronized 使用 wait()notify()ReentrantLock 使用 Condition

根据具体需求选择使用 synchronizedReentrantLock,如果需要更高级的锁控制和功能,可以选择 ReentrantLock。如果只需要简单的同步机制,synchronized 更加简洁易用。

 ⭐️ 好书推荐

《Effective Java中文版》

【内容简介】

        本书是Jolt获奖作品Effective Java的第3版,对上一版进行了全面更新,涵盖了从Java 5到Java 9的种种特性,是Java开发人员不可缺少的一本参考书。

        本书分为12章,包含90个条目,形式简洁。每个条目中都讲述了对Java的独到见解,阐明了如何编写高效、优雅的程序,并且提供了清晰、易懂的示例代码。与上一版相比,本书增加了Lambda表达式、流、Optional类、接口默认方法、try-with-resources、@SafeVarargs注解、模块等Java 7及以后所引入的新特性。本书介绍了如何充分利用泛型、枚举、注解、自动装箱、for-each循环、可变参数、并发机制等各种特性,帮助读者更加有效地使用Java编程语言及其基本类库(java.lang、java.util和java.io,以及子包,如java.util.concurrent和java.util.function等)。

📚 京东购买链接:【2024年全新译本】Effective Java中文版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CT】LeetCode手撕—232. 用栈实现队列

目录 题目1- 思路2- 实现⭐232. 用栈实现队列——题解思路 3- ACM 实现 题目 原题连接:232. 用栈实现队列 1- 思路 思路 ① 用两个栈来实现队列,一个 in 入栈 和一个 out 出栈② push 入队:入栈逻辑:即将元素加入到 in 栈 里即…

基于Redisson实现分布式锁

基于redisson实现分布式锁 之前背过分布式锁几种实现方案的八股文,但是并没有真正自己实操过。现在对AOP有了更深一点的理解,就自己来实现一遍。 1、分布式锁的基础知识 分布式锁是相对于普通的锁的。普通的锁在具体的方法层面去锁,单体应…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

爬虫-豆瓣电影排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析: 导入requests库调用了requests库中的…

界面材料知识

界面材料是用于填充芯片和散热器之间的空隙,将低导热系数的空气挤出,换成较高导热系数的材料,以提高芯片散热能力。参考下图 图片来源网上 热阻是衡量界面材料性能最终的参数,其中与热阻有关的有: 1、导热系数&#x…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘测定界报告(模板).doc

介绍几种 MySQL 官方高可用方案

前言: MySQL 官方提供了多种高可用部署方案,从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准,介绍下不同高可用方案架构原理及使用场景。 1.MySQL Replication MySQL Replication 是官方提供的主从同…

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR (得到正确shade函数&#x…

Spring Boot 文件上传和下载指南:从基础到进阶

文章目录 引言1. 环境配置2. 文件上传2.1 配置文件上传路径2.2 创建上传服务2.3 创建上传控制器 3. 文件下载3.1 创建下载服务3.2 创建下载控制器 4. 前端页面4.1 文件上传页面4.2 文件下载页面 5. 技术分析结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o …

Dns被莫名篡改的逆向分析定位(笔记)

引言:最近发现用户的多台机器上出现了Dns被莫名修改的问题,从系统事件上看并未能正常确定到是那个具体软件所为,现在的需求就是确定和定位哪个软件具体所为。 解决思路: 首先到IPv4设置页面对Dns进行设置:通过ProcExp…

@react-google-maps/api实现谷歌地图中添加多边围栏,并可编辑,编辑后可获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果~ ❤️ 由于该功能微微复杂一点,为了让大家精准了解 我精简了一下地图代码 大家根据自己的需求将center值和paths,用setState做活就可以了 1.第一步要加入项目package.json中或者直接yarn install它…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE:大模型 对比学习,从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型(InstructLM)的引入3. 生成文档的嵌入编码 提出背景 论文:https://…

2024亚太杯中文赛数学建模B题【洪水灾害的数据分析与预测】思路详解

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛 B题 洪水灾害的数据分析与预测 附件 train.csv 中提供了超过 100 万的洪水数据,其中包含洪水事件的 id、季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、…

一文搞懂 java 线程池:ScheduledThreadPool 和 WorkStealingPool 原理

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

Google Gemini:大上下文窗口是杀手级功能吗?

在八个月前,一封泄露的谷歌电子邮件透露,谷歌正努力超越其人工智能竞争对手。谷歌不仅没有围绕其人工智能产品的护城河——换句话说,没有建立起商业优势——也没有可以改变现状的秘诀。就在他们努力解决这个问题的同时,他们也看到…

SpringSecurity中文文档(Servlet Password Storage)

存储机制(Storage Mechanisms) 每种支持的读取用户名和密码的机制都可以使用任何支持的存储机制: Simple Storage with In-Memory AuthenticationRelational Databases with JDBC AuthenticationCustom data stores with UserDetailsServic…

2024/07/04

1、梳理笔记(原创) 2、终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

KBL610-ASEMI无人机专用整流桥KBL610

编辑&#xff1a;ll KBL610-ASEMI无人机专用整流桥KBL610 型号&#xff1a;KBL610 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;6A 功率(Pd)&#xff1a;中小功率 芯片个数&#xff1a…

【每天学会一个渗透测试工具】SQLmap安装教程及使用

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨SQLmap简介 Sqlmap是一款开源的渗透测试工具 &#x1f680;下载及安装 下载地址&#xff1a;http://sqlmap.org/ windo…

黑马点评DAY4|整体项目介绍、短信登录模块

项目整体介绍 项目功能介绍 项目结构 该项目前后端分离架构模式&#xff0c;后端部署在Tomcat服务器&#xff0c;前端部署在Niginx服务器上&#xff0c;这也是现在企业开发的标准做法。PC端首先向Niginx发起请求&#xff0c;得到页面的静态资源&#xff0c;页面再通过ajax向服…