系列二、Lock接口

news/2024/5/20 6:37:31 标签: JUC

一、多线程编程模板

线程        操作        资源类

高内聚                    低耦合

二、实现步骤

1、创建资源类
2、资源类里创建同步方法、同步代码块

三、12306卖票程序

3.1、synchronized实现

3.1.1、Ticket

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 8:54
 * @Description: 资源类火车票
 */
public class Ticket {

    private Integer num = 30;

    public synchronized void saleTicket() {
        if (num > 0) {
            System.out.println(Thread.currentThread().getName() + " 卖出第:" + (num--) + "张票,还剩下:" + num + "张票!");
        }
    }

}

3.1.2、SaleTicketSynchronizedMainApp

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 8:57
 * @Description: 需求:三个售票员  卖出  30张票(synchronized实现)
 * 多线程编程的企业级套路 + 模板:在高内聚低耦合的前提下,线程操作资源类
 */
public class SaleTicketSynchronizedMainApp {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "A").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "B").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "C").start();

    }

}

3.1.3、结果

3.2、Lock实现

3.2.1、Ticket

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 8:57
 * @Description: 需求:三个售票员  卖出  30张票(synchronized实现)
 * 多线程编程的企业级套路 + 模板:在高内聚低耦合的前提下,线程操作资源类
 */
public class SaleTicketSynchronizedMainApp {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "A").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "B").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "C").start();

    }

}

3.2.2、SaleTicketLockMainApp

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 8:57
 * @Description: 需求:三个售票员  卖出  30张票(Lock实现)
 * 多线程编程的企业级套路 + 模板:在高内聚低耦合的前提下,线程操作资源类
 */
public class SaleTicketLockMainApp {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "AA").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "BB").start();

        new Thread(() -> {
            for (int i = 1; i <= 40; i++) {
                ticket.saleTicket();
            }
        }, "CC").start();

    }

}

3.2.3、结果

四、Lock

4.1、概述

4.2、Lock接口的实现类ReentrantLock

4.3、如何使用ReentrantLock

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...
 
   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

4.4、synchronized VS Lock

(1)首先synchronized是java内置的关键字,在jvm层面,Lock是个java类;
(2)synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
(3)synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()释放锁),否则容易造成线程死锁;
(4)用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,           线程可以不用一直等待就结束了;
(5)synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平(两者皆可);
(6)Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题;


http://www.niftyadmin.cn/n/5199668.html

相关文章

AttributeError: module ‘numpy‘ has no attribute ‘int‘.

1&#xff1a;numpy的numpy.int在1.20已经启用&#xff0c;在1.24已经删除&#xff0c;降低版本到1.20之下&#xff1a; pip uninstall numpy 删除现有版本 pip install numpy1.19.0 但是我在安装1.19.0的时候报错&#xff1a; error: metadata-generation-failed 整了…

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例 振弦式渗压计是一种常用的水文地质监测仪器&#xff0c;主要用于测量土体中的渗流压力、水位变化等参数。而振弦采集仪则是一种数据采集和传输装置&#xff0c;可以将振弦式渗压计采集到的数据进行处理和传输。 在大坝水库…

简述谈一谈人工智能

人工智能对我们的生活影响有多大 人工智能在当今社会中扮演着不可忽视的角色&#xff0c;其对我们生活的影响之巨大&#xff0c;如同一位巧妙的魔术师&#xff0c;为我们解决问题、提供建议&#xff0c;甚至超越时间的界限&#xff0c;预测未来。从智能手机到智能家居&#xf…

Linux C 网络编程概述

网络编程 计算机网络概述分类网络体系结构通信协议通信流程网络通信帧格式以太网帧格式分析ARP 协议分析IP 数据报分析IP分类IP 分配子网掩码 TCP 段分析 TCP三次握手协议 ⭐TCP四次挥手协议 ⭐ TCP编程基于 TCP 客户端编程-步骤说明基于 TCP 服务器端编程-步骤说明基于 TCP 服…

某手机大厂员工爆料:40岁被裁,每月给88000补贴,连续给12个月,第二年减半,感觉废掉了!...

精彩回顾&#xff1a;进了央企&#xff0c;拿了户口&#xff0c;却感觉被困住了。 人生没有所谓的终点&#xff0c;只有不断再出发的起点&#xff0c;裁员只是人生的一个转角&#xff0c;而非尽头。 在时代的浪潮下&#xff0c;即使身处大厂&#xff0c;依然难逃被裁员的命运。…

wsl-ubuntu 系统端口总被主机端口占用问题解决

wsl-ubuntu 系统端口总被主机端口占用问题解决 0. 问题描述1. 解决方法 0. 问题描述 wsl-ubuntu 子系统中的服务&#xff0c;总是启动失败&#xff0c;错误信息是端口被占用。 用一些命令查看&#xff0c;被占用的端口也没有用服务启动。 1. 解决方法 运行&#xff0c; ne…

语音识别技术paddlespeech的安装和使用

PaddleSpeech 介绍 PaddleSpeech是百度飞桨&#xff08;PaddlePaddle&#xff09;开源深度学习平台的其中一个项目&#xff0c;它基于飞桨的语音方向模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。PaddleSpe…

Qt程序打包成.exe可执行文件

1.使用Release进行编译 2.找到编译成功的地址: 找到对应的目录 3.把SerialTool.exe文件单独复制到一个文件夹,这里我直接在桌面创建一个SerialTool文件夹,这时候直接运行是不行的,我们需要把库都导进去 4. 在安装目录找到如下这个文件,点击打开,找到你电脑对应的版本即可,我这…