Java多线程之同步锁-lock详解
作者:小虚竹and掘金 时间:2023-12-16 14:40:08
一、题目描述
题目:
同步锁出现的目的就是为了解决多线程安全问题。
同步锁的几种方式
synchronized
1、同步代码块
2、同步方法
jdk1.5后
3、lock锁:用lock()上锁,unlock()释放锁
实现:重现窗口售票多线程问题,并用lock锁解决。
二、解题思路
重现窗口售票多线程问题:
新创建类:LockDemo1
在main方法中,新创建三个线程,一起启动这三个线程。
新创建内部类:Ticket , Ticket implements Runnable
Ticket中每0.2秒卖一张票,用--i
使用lock锁:
新创建类:LockDemo2
在main方法中,新创建三个线程,一起启动这三个线程。
新创建内部类:Ticket , Ticket implements Runnable
在这段逻辑之前上锁,逻辑结束后释放锁 要把释放锁放在finally里
Ticket中每0.2秒卖一张票,用--i
lock锁相比于synchronized的好处是 灵活 ,可由研发人员自行控制加锁和解锁的时机。
三、代码详解
LockDemo1
/**
* Description: 重现窗口售票多线程问题
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改记录:
* 修改后版本 修改人修改日期修改内容
* 2022/5/15.1 xiaoxuzhu2022/5/15 Create
* </pre>
* @date 2022/5/15
*/
public class LockDemo1 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1号窗口").start();
new Thread(ticket, "2号窗口").start();
new Thread(ticket, "3号窗口").start();
}
static class Ticket implements Runnable {
private int tick = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tick > 0) {
System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick);
}
}
}
}
}
出现多线程问题:
LockDemo2
public class LockDemo2 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1号窗口").start();
new Thread(ticket, "2号窗口").start();
new Thread(ticket, "3号窗口").start();
}
static class Ticket implements Runnable {
private int tick = 100;
//创建锁
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
//上锁
lock.lock();
try {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tick > 0) {
System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick);
}
}finally {
lock.unlock();
}
}
}
}
}
来源:https://juejin.cn/post/7151202086519537700
标签:Java,同步锁
0
投稿
猜你喜欢
Android Studio 代码导航快捷键
2023-09-28 09:58:11
java Socket实现网页版在线聊天
2022-10-19 12:13:42
Android jni调试打印char阵列的实例详解
2022-06-18 14:55:40
C++实现LeetCode(9.验证回文数字)
2023-06-21 00:20:38
控制Android LED灯颜色的代码实例
2022-12-30 02:53:20
log4j2日志异步打印(实例讲解)
2023-11-12 09:02:13
SpringBoot封装响应数据实现过程详解
2023-01-17 21:32:51
c# FTP上传文件实例代码(简易版)
2023-09-08 11:43:56
Java 如何使用Velocity引擎生成代码
2023-10-19 23:15:34
Springboot @Configuration @bean注解作用解析
2022-11-05 01:58:47
Idea中maven项目实现登录验证码功能
2023-11-29 16:50:51
Java多线程之同步工具类CountDownLatch
2023-10-23 22:17:51
Android实现excel/pdf/word/odt/图片相互转换
2021-12-05 23:08:16
Android 手写热修复dex实例详解
2022-11-06 08:01:40
使用C++的string实现高精度加法运算的实例代码
2023-06-10 19:43:47
Java 运算符详情
2022-02-12 05:54:43
java中如何获取时间戳的方法实例
2021-06-14 15:29:16
探讨C#中Dispose方法与Close方法的区别详解
2023-01-24 03:59:55
C#判断某个软件是否已安装实现代码分享
2022-07-15 16:34:06
Java Comparable及Comparator接口区别详解
2023-07-03 08:19:50