synchronized 和 ReentrantLock 的区别

synchronized 和 ReentrantLock 都是 Java 中的同步机制,用于确保在多线程环境下,同一时刻只有一个线程能够访问特定的代码块、方法或对象。它们的区别在于实现方式和性能上。

synchronized、ReentrantLock

  • synchronized
    • 示例
  • ReentrantLock
    • 可重入
    • 公平性
    • 示例

synchronized

synchronized 是关键字,可以用于修饰方法或代码块。当使用 synchronized 修饰方法或代码块时,整个修饰的代码块或方法被锁住,只有当锁被释放时,才能继续执行。(加锁解锁以及锁升级过程由JVM自动控制)

示例

public class BiasLockExample {private static final Object LOCK = new Object();private static int count = 0;public static void main(String[] args) {Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {synchronized (LOCK) {count++;}}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {synchronized (LOCK) {count++;}}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count: " + count);}
}

ReentrantLock

ReentrantLock 是 API,通过实现 java.util.concurrent.locks.Lock 接口来提供锁功能。所以就需要手动进行加锁解锁处理,ReentrantLock 提供了更多的高级功能,如可重入、公平性、可设置超时等。

可重入

意味着同一个线程可以多次获得同一个锁。synchronized也有这个特点。

公平性

ReentrantLock分为公平锁和非公平锁(默认非公平锁),具体用法是new ReentrantLock(true/false),当false的时候是非公平锁,true的时候是公平锁,非公平锁和公平锁的区别可以简单理解为:
在公平锁中,先申请锁的线程一定会先获得锁,而不会被后申请锁的线程抢到。而在非公平锁中就不一定了,谁抢到算谁的,不管申请锁的顺序。

示例

import java.util.concurrent.locks.ReentrantLock;/*** ReentrantLock(可重入锁)*/
public class ReentrantLockTest {//创建锁对象(入参为是否开启公平锁)ReentrantLock lock = new ReentrantLock(false);public void method(){String thread_name = Thread.currentThread().getName();System.out.println(thread_name +"当前是否上锁:"+lock.isLocked());//加锁lock.lock();try {Thread.sleep(500);System.out.println(thread_name+"锁用完啦");}catch (Exception e){e.printStackTrace();}finally {//释放锁lock.unlock();}}public static void main(String[] args) {ReentrantLockTest t = new ReentrantLockTest();for (int i = 0; i < 5; i++) {new Thread(() -> {t.method();},"ReentrantLockTest-"+i).start();}for (int i = 5; i < 10; i++) {new Thread(() -> {t.method();},"ReentrantLockTest-"+i).start();}}
}

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

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

相关文章

使用流服务器m7s对接gb28181

优:sip品牌兼容性比较好,大华,海康都稳定可以,srs的5.0 sip品牌兼容性大华没反应,akstream-sip 大华也有问题,wvp也还可以 缺:目前最新的4.7.4版本,,sip协议用udp正常,TCP不正常(估计不支持),移动、事件,预警不支持 一、下载对应的m7s的执行文件 官网:快速起步…

Android开发中自定义View实现RecyclerView下划线

本篇文章主要讲解的是有关RecyclerView下划线的使用&#xff0c;主要有几个方法&#xff0c;具体如下&#xff1a; 第一种方式&#xff1a;网格分割线 public class GridDivider extends RecyclerView.ItemDecoration { private Drawable mDividerDarwable; private i…

深入理解c语言printf

printf(格式控制&#xff0c;输出列表); printf的使用方法大全 #include<stdio.h> int main(){double a123.111;int m-156;char csA;char *str"%d,%d";printf("%d",100,1);return 0; }

TextCNN的复现

TextCNN的复现–pytorch的实现 对于TextCNN的讲解&#xff0c;可以参考这篇文章 Convolutional Neural Networks for Sentence Classification - 知乎 (zhihu.com) 接下来主要是对代码内容的详解&#xff0c;完整代码将在文章末尾给出。 使用的数据集为电影评论数据集&…

(五)MySQL的备份及恢复

1、MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数据…

idea破解方法

idea破解&#xff1a;IDEA 2023.2.5 最新激活码,注册码&#xff08;亲测好用&#xff09;

GitHub 开启 2FA 双重身份验证的方法

为什么要开启 2FA 自2023年3月13日起,我们登录 GitHub 都会看到一个要求 Enable 2FA 的重要提示,具体如下: GitHub users are now required to enable two-factor authentication as an additional security measure. Your activity on GitHub includes you in this requi…

vivado 硬块规划器

硬块规划器 Versal自适应SoC的硬块规划GT组件从通用/通道更新为AMD的GT_QUAD粒度Versal™ 自适应SoC。为了启用某些GT共享用例&#xff0c;对GT向导流进行了修改使用Vivado IP集成商。使用Vivado IP集成商构建使用单个或多个GT_ QUAD。连接到GT_QUAD的自定义IP的设计条目为通过…

认知篇:什么是逆转诅咒?一个提问GPT的错误姿势

本系列文章主要是分享一些关于大模型的一些学术研究或者实验性质的探索&#xff0c;为大家更新一些针对大模型的认知。所有的结论我都会附上对应的参考文献&#xff0c;有理有据&#xff0c;也希望这些内容可以对大家使用大模型的过程有一些启发。 注&#xff1a;本系列研究关注…

养猫家庭如何挑选宠物空气净化器?猫用空气净化器品牌推荐!

家里的猫咪真的太可爱了&#xff0c;但它们的毛发总是无处不在。而且猫砂盆一天不清理&#xff0c;整个屋子都会弥漫着臭味。每天打扫也很费时费力&#xff0c;虽然享受着猫咪带来的快乐&#xff0c;但也不得不面对这些困扰。 一直以来&#xff0c;我都想购买一台空气净化器&a…

宠物处方单子怎么开,宠物门诊处方管理软件教程

宠物处方单子怎么开&#xff0c;宠物门诊处方管理软件教程 一、前言 宠物店电子处方软件操作教程以 佳易王宠物店电子处方管理系统V16.0为例说明。 如图&#xff0c;在开处方的时候&#xff0c;点击导航栏菜单&#xff0c;兽医处方按钮 点击 增加新单&#xff0c;填写宠物及…

Security ❀ HTTP/HTTPS逐包解析交互过程细节

文章目录 1. TCP三次握手机制2. HTTP Request 请求报文3. HTTP Response 响应报文4. SSL/TLS协议4.1. ClientHello 客户端Hello报文4.2 ServerHello 服务器Hello报文4.3. *ServerKeyExchange 服务公钥交换4.4. ClientKeyExchange 客户端公钥交换4.5. *CertificateVerify 证书验…

graphviz下载与使用-----决策树可视化

下载graphviz 官网:https://www.graphviz.org/download/ 安装graphviz 双击安装程序

《葡萄与葡萄酒鉴赏》期末考核

题目一:随着时代的发展&#xff0c;人们的生活水平逐渐提高&#xff0c;人们更加注重生活的质量和品位&#xff0c;葡萄酒已经成为人们生活中不可缺少的一部分。请论述葡萄酒的营养价值和经济价值。 葡萄酒的营养价值&#xff1a; 抗氧化物质&#xff1a;葡萄酒中富含抗氧化物…

vue中父组件直接调用子组件方法(通过ref)

目录 1、vue2 中&#xff0c;父组件调用子组件的方法 2、vue3 中&#xff0c;父组件调用子组件的方法 1、vue2 中&#xff0c;父组件调用子组件的方法 在Vue 2中&#xff0c;父组件可以通过使用ref属性来引用子组件的实例&#xff0c;然后通过该实例调用子组件的方法。 首先…

报错“MySql配置文件已损坏,请联系技术支持”的解决方法

目录 第一步 打开控制面板&#xff0c;选择管理工具&#xff0c;再选择事件查看器 第二步 在【应用程序】里找到这条报错&#xff0c;记下来文件内容。我自己的来源是“MsiInstaller” 第三步 winR组合键&#xff0c;输入regedit打开注册表 第四步 根据前面报错的文件名定位…

Linux ip命令

IP命令 从centos7以前我们一直使用ifconfig命令来执行网络相关的任务,比如检查和配置网卡信息&#xff0c;但是ifconfig已经不再被维护&#xff0c;并且在最近版本的Linux中被废除了&#xff01;ifconfig命令已经被ip命令所代替了。 ip 命令跟 ifconfig 命令有些类似&#xff…

靠着这篇笔记,我拿下了16k车载测试offer!

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Android 熄屏录音一分钟后没有声音

在使用录音功能的时候发现熄屏的时候过了一分钟之后就没有声音了&#xff0c;虽然录音还在录制但是没有声音&#xff0c;推测是熄屏后手机声音的什么服务关闭了。 可以用前台服务使录音这个动作保活&#xff0c;Android官方文档 服务概览 | Background work | Android De…

构建基于Flask的跑腿外卖小程序

跑腿外卖小程序作为现代生活中的重要组成部分&#xff0c;其技术实现涉及诸多方面&#xff0c;其中Web开发框架是至关重要的一环。在这篇文章中&#xff0c;我们将使用Python的Flask框架构建一个简单的跑腿外卖小程序的原型&#xff0c;展示其基本功能和实现原理。 首先&…