Synchronized 与 Lock 的使用

news2025/1/16 0:58:10

Synchronized的使用

        以卖票为例

//基本的卖票例子

/*
    真正的多线程开发,公司中的开发,降低耦合性
    线程就是一个单独的资源类,没有任何附属的操作
    1.属性、方法
 */
public class SaleTicketDemo01 {
    public static void main(String[] args) {
        //多个线程操作同一个资源类
        Ticket ticket = new Ticket();

        //@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                ticket.sale();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                ticket.sale();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                ticket.sale();
            }
        },"C").start();

    }

}

class Ticket {
    //属性、方法
    private int number = 50;

    //卖票的方式
    //synchronized 本质:队列,锁
    public synchronized void sale(){
        if (number>0){
            System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");
        }
    }


}

Lock锁

        需要手动加锁,释放锁

  Lock锁是一个接口,他有三个实现类:

  • ReentrantLock类
  • ReentrantReadWriteLock.ReadLock
  • ReentrantReadWriteLock.WriteLock

        以卖票为例

//基本的卖票例子

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
    真正的多线程开发,公司中的开发,降低耦合性
    线程就是一个单独的资源类,没有任何附属的操作
    1.属性、方法
 */
public class SaleTicketDemo02 {
    public static void main(String[] args) {
        //多个线程操作同一个资源类
        Ticket2 ticket = new Ticket2();

        //@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }
        new Thread(()->{
            for (int i = 0; i < 5; i++) {
                ticket.sale();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 5; i++) {
                ticket.sale();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 5; i++) {
                ticket.sale();
            }
        },"C").start();

    }

}

class Ticket2 {
    //属性、方法
    private int number = 15;

    Lock lock = new ReentrantLock();

    //lock三部曲
    //1. new ReentrantLock()
    //2.lock.lock(); //加锁
    //3.finally =>lock.unlock(); //解锁
    public synchronized void sale(){

        lock.lock(); //加锁


        try {
            //业务代码
            if (number>0){
                System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();  //解锁
        }
    }

}

Lock锁和synchronized的区别

  1. Synchronized是内置Java关键字;Lock是一个Java类。
  2. Synchronized无法判断获取锁的状态;Lock可以判断是否获取到了锁。(boolean b = lock.tryLock();)
  3. Synchronized会自动释放锁;Lock必须要手动释放锁,如果不释放锁,死锁。
  4. Synchronized线程1获得锁阻塞时,线程2会一直等待下去;Lock锁线程1获得锁阻塞时,线程2等待足够长的时间后中断等待,去做其他的事。
  5. Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可手动设置为公平锁)。
  6. Synchronized适合锁少量的代码同步问题;Lock适合锁大量的同步代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 可视化解释模型

1. 自定义DataSet MakeDataset.py 首先准备好一个数据集文件&#xff0c;这里以mydata文件夹存放图片数据&#xff0c; 实现自定义DataSet class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize resizedef __len__(self):retur…

【软件分析第13讲-学习笔记】符号执行 Symbolic Execution

文章目录前言正文符号执行基于霍尔逻辑的符号执行谓词转换计算最弱前置条件动态符号执行符号执行&#xff1a;进一步探究小结参考文献前言 创作开始时间&#xff1a;2022年11月16日18:46:31 如题&#xff0c;学习一下符号执行 Symbolic Execution的相关知识。参考&#xff1a…

计算机毕业设计jsp家校互动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 家校互动系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…

Linux用户操作(22.9.21)

学习目标&#xff1a; 用户账号管理Linux用户操作Linux用户组操作&#xff08;一&#xff09;用户账号管理 1、用户与用户组文件 在Linux系统当中&#xff0c;默认情况下所有用户信息保存在 /etc/passwd文件内&#xff0c;用户密码信息保存在/etc/shadow文件内&#xff1b;所…

43、Spring AMQP TopicExchange

1、TopicExchange 2、案例 3、通过配置类实现 1、配置TopicConfig 2、添加Listener 3、测试结果 4、通过注解实现 1、配置Linstener 2、测试结果 5、总结分析 学到这里&#xff0c;关于RabbitMQ的五种消息模型就结束了。 1、第一种消息模型&#xff1a;单个队列&#xff0c…

相机模型总结

目录相机模型前言1. pinhole 针孔模型2. Omnidirectional Camera Model 全向相机模型2.1 Unified model for catadioptric cameras 反射式相机统一模型2.2 Extended Unified model for catadioptric cameras (EUCM)2.3 Omnidirectional Camera Model By Scaramuzza畸变模型1. E…

linux篇【10】:进程信号

目录 一.信号入门 1.信号是操作系统内一个内置机制 2.前后台进程的几条命令与ctrlc 3.信号分类 4.信号产生是异步的 5.进程是如何记住这个信号 &#xff08;3&#xff09;存储方式&#xff1a;位图 二.signal ——对某信号设置自定义行为(捕捉)的函数 &#xff08;1&a…

【Linux】进程间通信之消息队列

系列目录 进程间通信——共享内存 进程间通信——信号量 文章目录 一、概念 二、消息队列函数 1.msgget 2.magsnd 3.msgrcv 4.msgctl 三、掌握消息队列操作 一、概念 提供了一种从另一种进程发送一个数据块的方法。而且每个数据块都被认为含有一个类型&#xff0c;接…

Python3《机器学习实战》学习笔记(十):ANN人工神经网络代码详解(数字识别案例以及人脸识别案例)

文章目录一、构建基本代码结构1.1预处理数据的工具包1.2 初始化参数1.3工具类sigmoid1.4工具类矩阵变换1.5初始化theta1.6正向传播1.7反向传播1.8梯度下降1.9训练模块二、MNIST数字识别三、人脸识别四、总结一、构建基本代码结构 1.1预处理数据的工具包 """Dat…

2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 C题 破局共享汽车 原题再现&#xff1a; 自 2015 年以来&#xff0c;共享汽车行业曾经“百花齐放”&#xff0c;多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题&#xff0c;陆续有共享汽车公司因为资金链断裂而倒闭。据…

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件&#xff0c;具有无限积压能力&#xff0c;并提供高吞吐、低延迟的服务能力&#xff0c;其最核心的部分必然是它优雅的存储设计。 1、存储概述 RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。 RocketMQ将所有…

温振传感器有几种传输方式?

在现代化社会中&#xff0c;各种机器无时无刻参与着我们的日常生活&#xff0c;承担在我们的周围承担起重要作用&#xff0c;轴承、电机、泵体等也成为工业文明中关键存在&#xff0c;它们的温度和状态影响着整个工业自动化系统运行的健康和效率。 长期以来&#xff0c;传感器技…

数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)

文章目录1.Verilog语言的设计思想和可综合特性2. 组合电路的设计2.1 数字加法器2.2 数据比较器2.3 数据选择器2.4 数字编码器2.4.1 3位二进制8线-3线编码器2.4.2 8线-3线优先编码器2.4.3 二进制转化十进制8421BCD编码器&#xff08;重要&#xff09;2.4.4 8421BCD十进制余3编码…

ue4使用Niagara粒子实现下雨效果,使用蓝图调节雨量

一、使用Niagara粒子系统实现下雨效果 1. 首先创建一个雨水的材质 新建 — 材质 2. 创建Niagara系统 新建 新建 — FX — Niagara系统 — 来自所选发射器的新系统 — 下一步 — 选择Fountain — 点击号&#xff0c;点击完成 删除下面的“Add Velocity in Cone” 添加“…

矩池云如何自定义端口,访问自己的web项目

本文将向您介绍如何在矩池云租用服务器的时候自定义端口&#xff0c;并将您的 web 项目部署到自定义端口&#xff0c;最后实现在本地通过自定义端口对应链接访问服务。 上传代码和数据 首先&#xff0c;您需要将本地的项目代码和数据上传到矩池云网盘。这里为了方便您测试使用…

类似ps的python工具lama cleaner

Lama Cleaner是个类似ps图片的工具&#xff0c;可以把图片中不想要的部分p掉&#xff0c;或者填补图片中丢失的部分。用下来感觉还蛮靠谱&#xff0c;对于不会ps的人是福音&#xff0c;记录一下。 相关介绍&#xff1a;https://github.com/Sanster/lama-cleaner 1.安装 安装…

react 中 ref 管理列表

背景 最近在看 react 新的官方文档 的时候&#xff0c;看到这么一个标题&#xff0c;How to manage a list of refs using a ref callback&#xff0c;就是一个图片的列表&#xff0c;类似这样 然后点击按钮的时候&#xff0c;通过 scrollIntoView 这个 api 来让他滚动&#…

python生成模拟微信气泡图片

0. 起因 众所周知&#xff0c;借刀杀人最为致命&#xff0c;聊天也是如此。 最近我的群聊画风逐渐变味&#xff1a; 当然&#xff0c;这种图片的生产成本很低&#xff0c;只需在设置页关闭昵称显示&#xff0c;把聊天背景重置为灰色&#xff0c;然后利用截图工具截图&#xf…

【金融项目】尚融宝项目(十三)

25、充值 25.1、需求介绍 25.1.1、投资人充值 **1、需求描述 ** 标的产生后&#xff0c;平台展示标的&#xff0c;投资人就可以在平台投资标的&#xff0c;获取收益&#xff1b;投资人投资标的必须满足以下条件&#xff1a; 充值过程与绑定过程一致&#xff0c;也是在平台发…

Delphi 11.2 Alexandria程序集代码

Delphi 11.2 Alexandria程序集代码 高DPI VCL设计器-VCL设计器现在在设计时使用类似Microsoft Windows的样式&#xff0c;这意味着除非禁用此功能&#xff0c;否则设计器中的控件始终使用此样式绘制。此样式与Windows当前使用的浅色或深色主题相匹配。 编辑器选项卡-在版本11.2…