第78题JAVA高级技术-多线程12(同步锁-lock)
Posted 小虚竹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第78题JAVA高级技术-多线程12(同步锁-lock)相关的知识,希望对你有一定的参考价值。
回城传送–》《JAVA筑基100例》
文章目录
零、前言
今天是学习 JAVA语言 打卡的第78天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。
因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
一、题目描述
题目:
同步锁出现的目的就是为了解决多线程安全问题。
同步锁的几种方式
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();
四、推荐专栏
五、示例源码下载
关注下面的公众号,回复筑基+题目号
筑基78
以上是关于第78题JAVA高级技术-多线程12(同步锁-lock)的主要内容,如果未能解决你的问题,请参考以下文章