软件编程
位置:首页>> 软件编程>> java编程>> Java多线程之同步锁-lock详解

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

作者:小虚竹and掘金  发布时间:2023-12-16 14:40:08 

标签: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    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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com