Lock锁

2023-11-17

  Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition

1、传统的synchronized 

package cn.dczh.juc;

/**
 * @ClassName: MaipiaoDemo1
 * @description: 买票案例 synchronized版本 
 * @author: 
 * @date: 2022/3/16 20:39
 * @version: 1.0
 */
public class MaipiaoDemo1 {

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

class Ticket {
    private int number = 50;
    //synchronized 本质: 排队 锁  非公平
    //锁  对象 Clazz
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "票,剩余" + number);
        }
    }
}
Lock接口

Lock接口

 

 

package cn.dczh.juc;

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

/**
 * @ClassName: MaipiaoDemo2
 * @description: 买票案例 lock版本
 * @author: 
 * @date: 2022/3/16 21:00
 * @version: 1.0
 */
public class MaipiaoDemo2 {

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

//Lock
class Ticket2 {

    private int number = 30;

    Lock lock = new ReentrantLock();

    //锁  对象 Clazz
    public void sale(){
        try {
            //加锁
            lock.lock();
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "票,剩余" + number);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //解锁
            lock.unlock();
        }
    }
}

synchionized与lock的区别?

  1. synchronized是java关键字,lock是一个java类;
  2. synchronized无法判断锁的状态,lock可以判断是否获取到锁
  3. synchronized会自动释放锁,lock必须要手都释放锁 ,不释放锁会造成死锁;
  4. synchronized线程1(获得锁,等待)、线程2(等待、傻傻等),lock就不一定等待 lock.trylock();
  5. synchronized可重入锁、不可中断、非公平,lock可重入锁,可以判断锁,非公平锁(可以自己设置);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lock锁 的相关文章

  • 理解什么是 JMM

    理解什么是 JMM 本文已收录至 GitHub https github com yifanzheng java notes Java 虚拟机是一个完整的计算机的一个模型 因此这个模型自然也包含一个内存模型 Java 内存模型 也就是说 J
  • 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference

    参考文章 http blog csdn net chen77716 article details 6618779 目前在Java中存在两种锁机制 synchronized和Lock Lock接口及其实现类是JDK5增加的内容 其作者是大名
  • 安全线程的集合

    1 CopyOnWriteArrayList package com kuang unsafe import java util import java util concurrent CopyOnWriteArrayList java u
  • 并发编程(线程)面试题总结2022

    目录 并发编程三要素是什么 在 Java 程序中怎么保证 多线程 的运行安全 什么是多线程 多线程的优劣 形成死锁的四个必要条件是什么 创建线程有哪几种方式 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口
  • Synchronized实现原理

    查看带有Synchronized语句块的class文件可以看到在同步代码块的起始位置插入了moniterenter指令 在同步代码块结束的位置插入了monitorexit指令 JVM需要保证每一个monitorenter都有一个monito
  • Java并发编程系列 - Java内存模型

    Java并发编程 可见性 原子性 有序性 Java内存模型如何解决可见性 有序性 并发问题产生的根源 可见性 原子性 有序性 可见性 Java内存模型的主要目标是定义程序中变量的访问规则 即在虚拟机中将变量存储到主内存或者将变量从主内存取出
  • 生产者与消费者问题?

    生产者消费者模式是并发 多线程编程中经典的设计模式 简单来看 就是一个类负责生产 一个类负责消费 举例来说 一个变量 生产者不断增加这个变量 消费者不断减少这个变量 在互联网应用中 抢票机制就是应用了该模式 比如大麦网演唱会门票抢票 123
  • java如何正常关闭一个线程

    如何关闭一个线程 调用stop方法 该方法存在一个问题 JDK官方不推荐使用 该方法在关闭线程时可能不会释放掉monitor的锁 所以建议不要使用该方法结束线程 正常关闭 2 1 线程正常结束生命周期 线程运行结束 完成自己的使命之后 就会
  • C/C++基于线程的并发编程(二):线程安全和线程锁

    线程安全 所谓线程安全不是指线程的安全 而是指内存的安全 线程是由进程所承载 所有线程均可访问进程的上下文 意味着所有线程均可访问在进程中的内存空间 这也是线程之间造成问题的潜在原因 当多个线程读取同一片内存空间 变量 对象等 时 不会引起
  • BlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue原理分析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于 当队列是空的时 从队列中获取元素的操作将会被阻塞 或者当队列是满时 往队列里添加元素的操作会被阻塞 试图从空的阻塞队列中获取元素的线程将会被阻塞 直到其他的线程往空的队列插入新的元素 同样
  • AQS原理解析及源码分析

    目录 1 介绍下AQS几个重要的组件 2 内部成员变量state 3 同步队列NODE 4 等待队列 condition AbstractQueuedSynchronizer又称为队列同步器 后面简称AQS AQS的核心思想是 如果被请求的
  • ReentrantLock实现PV操作-模拟多线程竞争数据库连接池资源场景

    使用ReentrantLock Condition模拟PV操作 实现多线程竞争数据库连接池资源 资源耗尽后阻塞等待 归还资源后唤醒阻塞线程的场景 代码中为10个线程竞争5个数据库连接资源 ConnectionPool class 连接池 C
  • 高并发,你真的理解透彻了吗?

    高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 在过往的面试中 如果候选人做过高并
  • Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别

    在多线程并发编程中Synchronized一直是元老级角色 很多人都会称呼它为重量级锁 但是随着Java SE1 6对Synchronized进行了各种优化之后 有些情况下它并不那么重了 Java SE1 6中为了减少获得锁和释放锁带来的性
  • wait notify正确使用方式

    wait notify正确使用方式 假设 当线程 Thread03 在1 100中找出77并输出后 Thread01 输出所有1 100中的奇数 当线程 Thread03 在1 100中找出88并输出后 Thread02 输出所有1 100
  • Semaphore 源码分析

    需要提前了解的知识点 AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore 信号量 是用来控制同时访问特定资源的线程数量 它通过协调各个线程 以保证合理的使用公共资源 比如控制用户的访问量 同一时刻只允
  • synchronized的作用和用法

    郁闷 参考 synchronized的作用和用法 Java中Synchronized的使用 文章目录 简单介绍 用法 实战实例 修饰代码块 修饰普通方法 修饰静态方法 简单介绍 synchronized关键字是用来控制线程同步的 就是在多线
  • JDK8新增锁StampedLock详解

    1 StampedLock是做什么的 它是ReentrantReadWriteLock 的增强版 是为了解决ReentrantReadWriteLock的一些不足 2 ReentrantReadWriteLock有什么不足之处呢 我们都知道
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • 接口并发性能测试开发之:从测试方案设计、测试策略、指标分析到代码编写,这一篇全搞定。

    并发接口性能设计思路与代码编写 1 引言 2 并发测试定义 3 并发测试分类 4 设计思路整理 5 测试方案设计 6 指标分析 7 代码实战 8 总结 1 引言 这篇是我3月份在公司内部做的技术分享内容 由于我在公司内部分享的内容较多 以及

随机推荐

  • 数据挖掘--分类算法的优缺点

    1决策树 Decision Trees 的优缺点 决策树的优点 一 决策树易于理解和解释 人们在通过解释后都有能力去理解决策树所表达的意义 二 对于决策树 数据的准备往往是简单或者是不必要的 其他的技术往往要求先把数据一般化 比如去掉多余的
  • 万向区块链元宇宙系列报告:对工业元宇宙的认知

    伴随着元宇宙概念大热 国内外多个巨头企业抢先布局 国内多个地方政府也在积极布局 发展元宇宙技术及相关产业 试图抢占先机 针对各业务场景与元宇宙的融合 万向区块链首席经济学家办公室团队出具了系列元宇宙相关研究报告 本篇将主要聚焦工业元宇宙 探
  • json和pickle的dump,dumps,load,dumps方法的使用

    序列化 Serialization 将对象的状态信息转换为便于存储或传输的形式的过程称之为序列化 该过程的逆向则称之为反序列化 如 1 数据和文本的转换 2 Python的数据类型和二进制数据类型的转化 3 Python的数据类型和json
  • 微信小程序 - 判断一个经纬度是否在一个多边形区域内

    功能描述 最近公司做了一个定位打卡的小程序 需要判断用户的经纬度是否在一个闭合的多边形区域内 在区域内允许打卡 否则提示 不再打卡范围 由于腾讯地图小程序SDK没有提供相关功能 所以需要自己手写造轮子 实现思路 首先已知一个用户坐标 x0
  • python函数式编程例子-python之面向过程,函数式编程,面向对象浅析

    python编程有面向过程 面向函数 面向对象三种 那么他们区别在哪呢 这个问题 让我想起我在学习编程的时候 我的老师给我举的例子 分享给大家 面向过程就是将编程当成是做一件事 要按步骤完成 比如煮咖啡这件事 先拿一定量的咖啡豆 然后磨成粉
  • Vue----双向绑定指令

    文章目录 3 7 双向绑定指令 3 7 1 v model 指令的修饰符 3 7 双向绑定指令 vue提供了 v model双向绑定指令 用来辅助开发者在 不操作DOM 的前提下 快速 获取表单数 据
  • 使用idea自带的maven插件配置镜像

    一 选择idea自带maven路径 setting文件的位置选择 二 打开setting文件 三 修改maven的镜像
  • 华为HCIE云计算之Fusion Access桌面云

    华为HCIE云计算之Fusion Access桌面云 一 Fusion Access介绍 二 华为Fusion Access架构 1 Fusion Access桌面云解决方案逻辑架构 2 FusionSphere云平台架构 三 Fusion
  • 【无人机分配】一种无人机实时最优任务分配模型附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • 不能看到共享的服务器文件夹,服务器不能共享文件夹

    服务器不能共享文件夹 内容精选 换一换 VPC为弹性云服务器构建隔离的 用户自主配置和管理的虚拟网络环境 提升用户云中资源的安全性 简化用户的网络部署 使用弹性文件服务时 文件系统和云服务器归属于同一VPC下才能文件共享 VPC可以通过网络
  • Java发送HTTP的get,post请求(JSON)

    import net sf json JSONObject import org apache commons httpclient import org apache commons httpclient methods GetMetho
  • 2020-09-06

    Elasticsearch Elasticsearch 简称ES 是一个可分布式的实时搜索和分析引擎 一个建立在全文搜索引擎 一个建立在全文搜索引擎Apache Lucence基础上的搜索引擎 它不仅可以进行全文搜素 还可以进行以下工作 分
  • centos7 Docker化应用体验

    centos7 Docker化应用体验 环境分析 WordPress运行环境需要如下软件的支持 PHP 5 6 或 更新版本 MySQL 5 6 或 更新版本 Apache 和 mod rewrite 模块 下载应用镜像 下载mariadb
  • RobotFramework-ride自动化操作教程

    一丶启动robotframework 启动RIDE 打开用例文件 找到文件位置 gt 选择文件 查看资源文件 确保用例所需资源文件当前目录都存在 三 用例编写 执行 新增用例 2 执行用例 勾选要执行的用例 点击run tests 或者 F
  • 浅谈漏洞及其分类

    浅谈漏洞及其分类 一 漏洞概念 漏洞是指一个系统上硬件 软件 协议等具体实现或系统安全策略上存在的弱点或缺陷 系统对特定威胁攻击或危险事件的敏感性 或进行攻击的威胁作用的可能性 这些缺陷 错误或不合理之处可能被有意或无意地利用 可以使攻击者
  • python中unexpected indent报错的解决办法

    python中unexpected indent报错的解决办法 在我们初步学习pyton的时候 由于对python语言的学习掌握不充分 则会导致所编写的代码 运行时候报错 比如 容易报错的unexpected indent问题 下面举例说明
  • Mybatis多对多查询+PageHelpler分页问题

    多对多查询 说明 tb user用户表 tb role角色表 tb user role用户角色关联表 实现表数据的多对多查询并返回 使用PageHelper对查询结果分页 用户表 Data NoArgsConstructor AllArgs
  • 想学好python?这18条学习技巧你一定要掌握。能甩别人两条街。

    在这篇文章中 我们将讨论最常用的python技巧 大多数这些技巧都是我在日常工作中使用过的简单的Trick 我觉得好东西就是要拿出来和大家一起分享 闲话少说 我们直接开始吧 处理用户的多个输入 有时我们需要从用户那里获得多个输入 以便使用循
  • 手把手教你在Tensorflow实现BEGAN 达到惊人的人脸图像生成效果

    导读 本文是基于谷歌大脑 Google Brain 发表在 arXiv 的最新论文 BEGAN 边界平衡生成对抗网络 实现的 该工作针对GAN 面临的一些难题 例如如何衡量收敛 如何控制分布多样性以及如何维持鉴别器和生成器之间的平衡等问题
  • Lock锁

    Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作 它们允许更灵活的结构化 可能具有完全不同的属性 并且可以支持多个相关联的对象Condition 1 传统的synchronized package cn d