lock锁

article/2025/9/20 14:06:46

目录

1. lock 基本用法

2. lock公平锁与非公平锁

3. lock注意事项

4. synchronized 与 lock区别


1. lock 基本用法

lock.lock();  
try {} finally {lock.unlock()
}或者try {lock.lock();
} finally {lock.unlock()
}public class ThreadLock1 {public static void main(String[] args) {//1. 创建锁对象Lock lock = new ReentrantLock();//2. 加锁lock.lock();try{System.out.println("你好");}finally {// 3. 释放锁lock.unlock();   }}
}输出:
你好

注意:lock要放到try外,或者try里面的第一行。

原因有两个:
        1. 如果放在 try ⾥⾯,因为 try 代码中的异常导致加锁失败,还会执⾏ finally 释放锁的操作。
        2. unlock 异常会覆盖 try ⾥⾯的业务异常,增加排查错误的难度。

2. lock公平锁与非公平锁

非公平锁:
public class ThreadLock2 {private static int number = 0;static class Counter {//1. 创建锁对象private static Lock lock = new ReentrantLock();//循环次数private static int MAX_COUNT = 1000000;public static void incr() {for (int i = 0; i < MAX_COUNT; i++) {lock.lock();try {number++;} finally {lock.unlock();}}}public static void decr() {for (int i = 0; i < MAX_COUNT; i++) {lock.lock();try {number--;} finally {lock.unlock();}}}}public static void main(String[] args) throws InterruptedException {long stime = System.currentTimeMillis();Thread t1 = new Thread(() ->{Counter.incr();});t1.start();Thread t2 = new Thread(() ->{Counter.decr();});t2.start();t1.join();t2.join();long etime = System.currentTimeMillis();System.out.println("最终结果:" + number + "   执行时间:" + (etime - stime));}
}输出:
最终结果:0   执行时间:172
公平锁
修改:private static Lock lock = new ReentrantLock(true);输出:
最终结果:0   执行时间:5382

可以明显看出非公平锁比公平锁性能好很多。 

3. lock注意事项

        1. unlock操作一定要在finally里面。

                会出现的问题:可能会导致锁资源永久占用的问题。

        2. lock()  一定要放在try之前,或者是try的首行。

                会出现问题:a. 未加锁却执行了释放锁的操作。  b. 释放锁的错误信息会覆盖业务报错信息,从而增加调试程序和修复程序的复杂度。

public class ThreadLock4 {public static void main(String[] args) {Lock lock = new ReentrantLock();try {System.out.println("进入了 try 方法");int i = 10 / 0; // 某一种极端的操作System.out.println("执行 lock 操作");lock.lock();} finally {System.out.println("执行 unlock 操作");lock.unlock();}}
}输出:进入了 try 方法执行 unlock 操作Exception in thread "main" java.lang.IllegalMonitorStateExceptionat java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)at thread.ThreadLock4.main(ThreadLock4.java:24)
public class ThreadLock4 {public static void main(String[] args) {Lock lock = new ReentrantLock();System.out.println("执行 lock 操作");lock.lock();try {System.out.println("进入了 try 方法");int i = 10 / 0; // 某一种极端的操作} finally {System.out.println("执行 unlock 操作");lock.unlock();}}
}输出:执行 lock 操作进入了 try 方法执行 unlock 操作Exception in thread "main" java.lang.ArithmeticException: / by zeroat thread.ThreadLock4.main(ThreadLock4.java:20)

4. synchronized 与 lock区别

        1. Lock更灵活,有更多的方法。比如,try lock()......

        2. Lock默认是非公平锁,但可以指定为公平锁;synchronized只能为非公平锁。

        3. 调用lock方法和synchronized线程等待锁状态不同,lock方法会变味WAITING,而synchronized会变为BLOCKED。

        4. synchronized是JVM层面提供的锁,它是自定进行加锁和释放锁,对于开发者来说是无感的;而lock需要开发者自己进行加锁和释放锁的操作。

        5. synchronized可以修改方法(静态方法/普通方法) 和代码块;而lock只能修饰代码块。

lock等待时,WAITING状态:public class ThreadLock5 {public static void main(String[] args) throws InterruptedException {Lock lock = new ReentrantLock();System.out.println("执行lock操作");Thread t1 = new Thread(() -> {lock.lock();System.out.println("线程1得到锁");try{Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("线程1释放锁");lock.unlock();}});t1.start();Thread t2 = new Thread(() -> {try{Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lock.lock();try {System.out.println("线程2得到锁");}finally {System.out.println("线程2释放锁");lock.unlock();}});t2.start();Thread.sleep(1500);System.out.println("线程2: " + t2.getState());t1.join();t2.join();}
}
输出:
执行lock操作
线程1得到锁
线程2: WAITING
线程1释放锁
线程2得到锁
线程2释放锁

public class ThreadLock6 {public static void main(String[] args) throws InterruptedException {System.out.println("执行synchronized操作");Thread t1 = new Thread(() -> {synchronized (ThreadLock6.class) {System.out.println("线程1得到锁");}try{Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread t2 = new Thread(() -> {try{Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (ThreadLock6.class) {System.out.println("线程2得到锁");}});t2.start();Thread.sleep(1500);System.out.println("线程2: " + t2.getState());t1.join();t2.join();}
}输出:
执行synchronized操作
线程1得到锁
线程2得到锁
线程2: TERMINATED

synchronized 讲解:

synchronized_Youcan.的博客-CSDN博客


http://chatgpt.dhexx.cn/article/vG4YEf9f.shtml

相关文章

LOCKED勒索病毒解密 数据恢复

什么是LOCKED勒索病毒 LOCKED勒索病毒是由Michael Gillespie发现的。该恶意程序旨在通过加密来阻止对存储在计算机上的文件的访问。为了解密他们的文件&#xff0c;鼓励受害者购买解密工具。与大多数此类程序一样&#xff0c;[LOCKED] 重命名所有加密文件&#xff0c;在本例中…

服务器数据中了locked勒索病毒,有关locked勒索病毒的介绍与预防建议

随着网络的普及和科技技术的发展&#xff0c;网络安全问题日益突出。而其中&#xff0c;勒索病毒就是一种常见的网络安全威胁。一旦企业的服务器数据库被勒索病毒攻击&#xff0c;会导致企业内部的重要数据被加密&#xff0c;给工作和生产生活带了极大的困扰。下面就为大家介绍…

locked 勒索软件

1.Locked介绍 Locked病毒属于Void Crypt 勒索软件家族。该勒索软件会加密 PC 上的所有用户数据&#xff08;照片、文档、Excel 表格、音乐、视频等&#xff09;&#xff0c;将其特定扩展名添加到每个文件&#xff0c;并在每个包含加密文件的文件夹中创建文件。 2.我是如何在我…

MEID

MEID简介 Mobile Equipment IDentifier&#xff08;MEID&#xff09;是全球唯一的56bit移动终端标识号。标识号会被烧入终端里&#xff0c;并且不能被修改。可用来对移动式设备进行身份识别和跟踪。由于ESN号段是有限的资源&#xff0c;基本上耗尽&#xff0c;可能还有少量回收…

科谱|MEID表格如何填写,99开头,MEID怎么申请,MEID申请表填写

作为通信产品最常见的三大主流号码之一MEID最近这些年的存在感确实偏低了点&#xff0c;尽管如此还是有大量需要使用MEID号码的产品&#xff0c;及时快速准确的申请到号码还是必不可少的。 文化的差异和语言的不通会造成不大不小的麻烦&#xff0c;今天我们结合最新版的申请表…

关于安卓系统4.0/5.0/6.0获取单卡手机,双卡手机的imei1,imei2,meid(用反射来实现,史上最详细,最全面获取)--binbinyang

有的人问我要代码跟例子&#xff0c;上次在GITHUB上弄了一个&#xff0c;提供地址 给大家 https://github.com/binbinyYang/GetPhoneInfo https://github.com/binbinyYang/GetPhoneInfo -------------------------------------------------------- 最近这3天&#xff0c;一直在…

MEID 的构成

MEID 的构成如下&#xff0c;针对 Hex 格式&#xff1a; 最后一位是 CD&#xff0c;这个 CD 不是 MEID 的组成部分&#xff0c;真正的 MEID 是前 14 位。在手机与基站进行 MEID 检查时&#xff0c;手机提交的 MEID 不能包含 CD 位&#xff0c;否则就会出错。当初设计此 CD 位主…

Mina MEID/GSM Activator 1.0 三网信号激活,支持iOS12.0~14.8.1

Mina团队已经更新工具&#xff0c;现在支持MEID/GSM三网和两网解锁信号&#xff01;支持iOS14.8系统&#xff0c;两网价格和三网价格一样。 Mina MEID/GSM Activator可以激活所有MEID/GSM二网、三网恢复信号&#xff0c;并且支持打电话、短信、4G流量上网&#xff0c;支持iPhon…

高通芯片联机读取修改串码 meid ESN wifi 蓝牙 sn等参数的操作解析{二}

上次我发了几个相关联机读写参数的帖子。很多友友询问有没有其他相关软件来解读参数的教程。今天就来个续集来解析参数读写 关于安卓机型写串码 改串码 端口开启和基带qcn等一些经验 高通联机修改IMEI等参数的相关解析 高通芯片基带相关的软件 QPST QXDM DFS等等&#xff0c…

说说移动设备的各种标识码(DeviceID, IMEI, UUID, UDID, OAID, IDFA, GAID)

转战广告行业&#xff0c;收集整理一波移动设备各种标识码的含义当做基础知识储备 一、名词解释 Device ID&#xff1a;设备ID。IMEI&#xff1a;&#xff08;International Mobile Equipment Identity&#xff09;国际移动设备标识的缩写。是由15位数字组成的“电子串号”&a…

Mina MEID/GSM Activator 1.0 三网信号激活,支持12.5.3~14.7

Mina团队已经更新工具&#xff0c;现在支持MEID/GSM三网和两网解锁信号&#xff01;支持iOS14.7系统&#xff0c;两网价格和三网价格一样。 Mina MEID/GSM Activator可以激活所有MEID/GSM二网、三网恢复信号&#xff0c;并且支持打电话、短信、4G流量上网&#xff0c;支持iPhon…

Mina MEID Activator 2.120210512更新使用说明支持三网(移动、联通、电信)国行版手机解锁打电话4G苹果手机激活锁停用Hello密码锁绕ID屏幕锁密码

Mina MEID Activator 是由Minacriss开发的新工具。可以激活所有MEID三网的信号恢复&#xff0c;并且支持打电话、短信、4G流量上网。支持iPhone5sX直接所有型号&#xff0c;支持iOS12.5.2iOS14.4.2。MEID三网指&#xff1a;不小心忘记ID密码&#xff0c;而且已经刷机并且是激活…

关于IMEI、MEID、IMSI

关于IMEI、MEID、IMSI 简介 IMEI、MEID都是用于标识一台物理设备的ID信息。在Android 8.0以下系统提供的API中&#xff0c;会根据不同条件返回二者之一的信息。 IMEI&#xff1a; 国际移动设备识别码&#xff0c;是区别移动设备的标志&#xff0c;一般用于标识某一台独立的设…

2022最新手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)教程

Android篇 1 IMEI和MEID (1) IMEI (International Mobile Equipment Identity) 是国际移动设备身份码的缩写&#xff0c;国际移动装备辨识码&#xff0c;只有Android手机才获取的到&#xff0c;是由15位数字组成的"电子串号"&#xff0c;比如像这样 35988103031435…

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

目录 IMEI&#xff1a; MEID&#xff1a; MAC地址&#xff1a; Android_id&#xff1a; UUID&#xff1a; OAID&#xff1a; 安卓设备的唯一标识&#xff0c;获取的目的在于数据统计&#xff0c;广告归因分析等用途。常用作唯一标识的有IMEI&#xff0c;MEID&#xff0c;…

QA:MEID号申请、什么是MEID号、怎么申请MEID号、MEID号获取

本文671个字&#xff0c;正常大约需要阅读两分钟&#xff0c;完整阅读更精彩&#xff0c;欢迎点赞、转发或留言&#xff01; Q&#xff1a;什么是MEID号&#xff1f; A&#xff1a; MEID 移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码&#xff0c;也是…

什么是MEID号如何申请MEID,A0、A1、A2以及99开头的MEID号的区别?

MEID/ESN号段ESN Manufacturer’s (MFR) Codes (ESN 厂家代码段) 主要适用于CDMA类的产品Mobile Equipment IDentifier&#xff08;MEID&#xff09;是全球唯一的56bit移动终端标识号需要向美国申请。标识号会被输入终端里&#xff0c;无法修改。可用来对移动式设备进行身份识别…

如何深入理解 StatsD 与 Graphite ?

众所周知&#xff0c;StatsD 负责收集并聚合测量值。之后&#xff0c;它会将数据传给 Graphite&#xff0c;后者以时间序列为依据存储数据&#xff0c;并绘制图表。但是&#xff0c;我们不知道&#xff0c;基于 http 访问的图表在展示时&#xff0c;是基于每秒钟的请求数&#…

graphite 监控 简介

graphite是一个监控业务数据的监控系统。&#xff0c;该系统架构如下&#xff1a; 系统分为三大组件&#xff1a; carbon&#xff1a; 负责后端数据采集,可以通过以下客户端来采集数据 客户端应用有多个方式来发布度量值&#xff1a; 使用一个纯文本协议工具比如 netcat (n…

graphite在centos7上的部署搭建

Graphite安装笔记 实验环境&#xff1a; CentOS7.5 x64 部署python的程序推荐使用virtualenv这列的虚拟环境来进行&#xff0c;防止污染系统自带的python包。 安装一些必要的rpm包 yum install cairo -- 另外的2个包 cairo-devel pycairo 可以不用安装 安装virtualenv yum ins…