这篇文章主要为大家详细介绍了Java多线程中同步锁-lock的原理与使用,文中的示例代码讲解详细,对我们了解线程有一定帮助,需要的可以参考一下
一、题目描述
题目:
同步锁出现的目的就是为了解决多线程安全问题。
同步锁的几种方式
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 xiaoxuzhu 2022/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();
}
}
}
}
}
到此这篇关于Java多线程之同步锁-lock详解的文章就介绍到这了,更多相关Java同步锁内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Java多线程之同步锁-lock详解
- JSP 制作验证码的实例详解 2023-07-30
- Java实现顺序表的操作详解 2023-05-19
- ExecutorService Callable Future多线程返回结果原理解析 2023-06-01
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- Java中的日期时间处理及格式化处理 2023-04-18
- 深入了解Spring的事务传播机制 2023-06-02
- Springboot整合minio实现文件服务的教程详解 2022-12-03
- 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
- SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
- JSP页面间传值问题实例简析 2023-08-03