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);
               }
           }
       }
   }
}

出现多线程问题:

Java多线程之同步锁-lock详解

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详解

来源: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
  • asp之家 软件编程 m.aspxhome.com