JUC之Synchronized与Lock
Synchronized
称之为”同步锁
作用:
保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果
用法:
1.修饰方法:方法锁,锁的对象是当前对象
2.修饰静态方法:类锁,锁的对象是当前的类,实际是这个类的.class对象
3.修饰代码块:对象锁,锁的对象是synchronized修饰的对象
案例:
public class TestThread {public static void main(String[] arge){Ticket ticket = new Ticket();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"A").start();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"B").start();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"C").start();}
}class Ticket{private int num = 20;synchronized void ticket(){if(num > 0){System.out.println(Thread.currentThread().getName()+"剩余票数:"+num--);}}
}
修饰方法:
public synchronized void method()
{
}
修饰代码块:
class SyncThread implements Runnable {private static int count;public SyncThread() {count = 0;}public void run() {synchronized(this) {for (int i = 0; i < 5; i++) {try {System.out.println(Thread.currentThread().getName() + ":" + (count++));Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}public int getCount() {return count;}
}public class Demo00 {public static void main(String args[]){ SyncThread s = new SyncThread();Thread t1 = new Thread(s);Thread t2 = new Thread(s);t1.start();t2.start();}
}
修饰类:
给class加锁和上例的给静态方法加锁是一样的,所有对象公用一把锁
class ClassName {public void method() {synchronized(ClassName.class) {}}
}
注意:
1.在定义接口方法时不能使用synchronized关键字;构造方法不能使用synchronized关键字
2.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制
3.每个对象只有一个锁与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码
Lock
Lock是一个同步线程机制;
主要方法:
lock():获取锁,加锁
tryLock():判断锁是否可用
unlock():释放锁
使用:
public class TestThread2 {public static void main(String[] arge){Ticket2 ticket = new Ticket2();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"A").start();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"B").start();new Thread(()->{for(int i=1;i<40;i++){ticket.ticket();}},"C").start();}
}class Ticket2{private int num = 20;void ticket(){Lock lock = new ReentrantLock();lock.lock();try{if(num > 0){System.out.println(Thread.currentThread().getName()+"剩余票数:"+num--);}}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}
ReentrantLock
重入锁也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。避免死锁问题
public class ReentrantDemo implements Runnable {Lock lock = new ReentrantLock();@Overridepublic void run() {set();}public void set() {try {lock.lock();System.out.println("set 方法");get();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();// 必须在finally中释放}}public void get() {try {lock.lock();System.out.println("get 方法");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public static void main(String[] args) {ReentrantDemo reentrantDemo = new ReentrantDemo();new Thread(reentrantDemo).start();}
}
同一个线程,首先在set方法中获取锁,然后调用get方法,get方法中重复获取同一个锁。两个方法都执行成功
ReentrantReadWriteLock
读写锁,可以分别获取读锁或写锁。
特点:
读锁使用共享模式;写锁使用独占模式;读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。当有读锁时,写锁就不能获得;而当有写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁
常用方法:
writeLock():获取写锁
readLock():获取读锁
区别:
1.synchronized内置关键字;lock是一个Java类
2.synchronized无法判断锁状态;lock可以判断是否获取到锁
3.synchronized会自动释放锁;lock必须手动释放锁,不释放会造成死锁
4.synchronized可重入锁,不可以中断,非公平;lock可重入锁,可以判断锁,非公平(可以设置)
5.synchronized适合锁少量的代码同步问题;lock适合锁大量的同步代码
相关文章:
JUC之Synchronized与Lock
Synchronized 称之为”同步锁 作用: 保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果 用法: 1.修饰方法:方法锁,锁的对象是当前对象 2.修饰静态方法:类锁…...
动态规划理论基础
文章目录 定义动态规划与分治问题的区别两种方式实现动态规划方法一:带备忘录的自顶向下法方法二:自底向上法 本质核心解题步骤常见题型划分 定义 动态规划方法通常用来求解最优化问题(optimization problem)。这类问题可以有很多可行解,每个…...
Redis的数据类型
参考文档:https://www.runoob.com/redis/redis-tutorial.html redis当中一共支持五种数据类型,分别是: string字符串 list列表 set集合 hash表 zset有序集合 1、对字符串string的操作 下表列出了常用的 redis 字符串命令 1 设置值 获取…...
vue3鼠标经过显示按钮
在前端开发中,我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮,这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中,我将会介绍如何使用 Vue3 实现一个鼠标经过显…...
【2023华为OD笔试必会25题--C语言版】《18 最短木板长度》——数组
本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...
yolov5车道线检测+测距(碰撞检测)
yolov5车道线检测+测距(碰撞检测) 1. 车道线检测2. 测距2.1 测距原理2.2 相机标定2.2.1:标定方法12.2.2:标定方法23. 相机测距3.1 测距添加3.2 主代码4. 实验结果相关链接 1. 基于yolov5的车道线检测及安卓部署 2. YOLOv5+单目测距(python) 3. 具体实现效果...
微服务学习笔记--(Gateway网关)
统一网关Gateway 为什么需要网关gateway快速入门断言工厂过滤器工厂全局过滤器跨域问题 Gateway网关-网关作用介绍 为什么需要网关 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种: …...
QML插件的创建及调用
QML插件的创建及调用 创建QML Plugin注册插件调用插件 创建QML Plugin 1、 注册插件 1、可以将qml文件放在qmldir中进行声明。 此种方式需要将qml文件和qmldir放在一起 module EularFrame plugin EularFrameEButton 1.0 MyButton.qml2、可以在*plugin.cpp注册 此种方式只需…...
数据结构学习分享之树的介绍
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:数据结构学习分享⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你了解更多数据结构的知识 🔝🔝 数据结构第六课 1. 前言&a…...
MySQL数据库基础2
文章目录 数据类型表的约束 数据类型 1、数值类型:BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)] FLOAT[(M,D)]:占用四个字节,M表示显示位数,D表示小数位数,精度保证&am…...
AutoSAR PNC和ComM
文章目录 PNC和ComMPNC管理NM PDU结构及PNC信息位置如何理解节点关联PNCPNC状态管理 ComM 通道状态管理 PNC和ComM PNC 和 ComM层的Channel不是一个概念,ComM的Channel对应具体的物理总线数。 在ComM模块中,一个Channel可以对应一个PNC,也可…...
Android studio Camera2实现的详细流程
流程 一、获取CameraManager实例二、获取可用的相机列表三、选择一个相机并打开它四、创建一个CaptureRequest.Builder对象五、设置CaptureRequest.Builder对象的参数六、创建一个CaptureSession对象七、开始预览 代码示例 一、获取CameraManager实例 CameraManager manager (…...
阿里云数据库ClickHouse产品和技术解读
摘要:社区ClickHouse的单机引擎性能十分惊艳,但是部署运维ClickHouse集群,以及troubleshoot都不是很好上手。本次分享阿里云数据库ClickHouse产品能力和特性,包含同步MySQL库、ODPS库、本地盘及多盘性价比实例以及自建集群上云的迁…...
分子动力学基础知识
分子动力学基础知识 目前主要存在两种基本模型:其一为量子统计力学, 其二为经典统计力学。 量子统计力学 基于量子力学原理, 适用 于微观的, 小尺度, 短时 间的模拟,可以描述电子 的结构分布,原子间的成 键断键等化学性质。 经典纭计力学…...
USB转UART转串口芯片 GP232RNL国产低成本替代FT232RL/FT232RNL
近期收到很多人咨询FT232RL跟新版FT232RNL两者有什么区别,实际上就是内部做了一点升级,FT232RNL支持Windows11系统,参数并没有改动,完全可以直接替换使用。 今天小编给大家讲讲FT232RNL国产低成本替代芯片–GP232RNL GP232RNL 是…...
第03讲:SpringCloudStream实现分布式事务
需求分析 本案例是通过一个发送短信验证码的功能来实验MQ发送消息时实现分布式事务,思路分析如下 消息生产者生产发送验证码的半消息 生产者执行本地事务(将验证码保存到数据库),并记录事务的ID,如果整个过程不出现异…...
【从零开始学Skynet】高级篇(一):Protobuf数据传输
1、什么是Protobuf Protobuf是谷歌发布的一套协议格式,它规定了一系列的编码和解 码方法,比如对于数字,它要求根据数字的大小选择存储空间,小于等于15的数字只用1个字节来表示,大于15的数用2个字节表示,以此…...
快速入门Lombok
Lombok是一个Java库,可以通过注解的方式来简化Java代码,它可以自动生成Getter、Setter、构造函数等代码,从而减少重复的模板代码。下面是Lombok的使用详情: 1. 添加Lombok依赖 在使用Lombok之前,我们需要先添加Lombo…...
Linux 常见命令与常见问题解决思路
Linux 常见命令 Linux 基础命令目录相关查看文件(日志)查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…...
用GPT-4 写2022年天津高考作文能得多少分?
正文共 792 字,阅读大约需要 3 分钟 学生必备技巧,您将在3分钟后获得以下超能力: 积累作文素材 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lexica …...
不同品牌路由器也能玩桥接?TP-LINK AC1200主路由+FAST FWR303副路由详细配置指南
跨品牌路由器桥接实战:TP-LINK AC1200与FAST FWR303混合组网全解析 现代家庭网络环境中,信号死角问题如同房间角落的灰尘一样难以避免。特别是当房屋结构复杂或面积较大时,单台路由器往往力不从心。此时,利用家中闲置的旧路由器进…...
SDMatte与LSTM时序模型结合:处理视频连续帧的稳定抠图
SDMatte与LSTM时序模型结合:处理视频连续帧的稳定抠图 1. 引言:视频抠图的挑战与机遇 视频抠图技术一直是影视后期和直播领域的核心需求。传统方法在处理动态场景时常常面临边缘闪烁、细节丢失和时间不一致等问题。想象一下,当你在视频会议…...
10分钟重塑Windows体验:Win11Debloat系统优化完全指南
10分钟重塑Windows体验:Win11Debloat系统优化完全指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改…...
像素幻梦·创意工坊实操手册:实时HUD状态栏信息读取与调试技巧
像素幻梦创意工坊实操手册:实时HUD状态栏信息读取与调试技巧 1. 认识像素幻梦的HUD状态栏 像素幻梦创意工坊的HUD(Head-Up Display)状态栏位于界面顶部,采用16-bit像素风格设计,为创作者提供实时系统状态反馈。这个看…...
别再让运动模糊毁了你的检测!一文搞懂工业相机飞拍里的CMOS传感器与快门速度怎么配
工业相机飞拍实战:CMOS传感器与快门速度的黄金搭配法则 在一条每分钟处理300个瓶盖的高速灌装线上,质检员小王发现相机拍摄的字符总是出现拖影——这已经是本周第三次因图像模糊导致误检停线了。类似场景每天都在全球数以万计的自动化产线上演࿰…...
Cowabunga Lite:iOS系统个性化定制的免越狱解决方案
Cowabunga Lite:iOS系统个性化定制的免越狱解决方案 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 在iOS生态系统中,用户对系统个性化的需求与日俱增,但传…...
Legacy iOS Kit:5个实用技巧让你的旧iPhone重获新生
Legacy iOS Kit:5个实用技巧让你的旧iPhone重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你是否有…...
从科研到工程:为什么我选择用ROS2重构Apollo/autoware的规控算法?
从科研到工程:为什么我选择用ROS2重构Apollo/autoware的规控算法? 在自动驾驶领域,从实验室原型到量产系统的跨越,往往伴随着技术栈的全面升级。三年前,当我第一次将Apollo的规划控制模块移植到ROS1环境时,…...
对于对话中的用户长期兴趣建模,OpenClaw 的序列推荐方法?
关于对话系统中如何捕捉用户长期兴趣这件事,业内琢磨了挺长时间。传统的序列推荐模型,比如那些基于循环神经网络或者注意力机制的,往往更擅长处理短期的、密集的交互序列。它们像是一个敏锐的现场观察者,能立刻抓住你刚才点击了什…...
Musicdl革新性全场景音乐解决方案:5个维度揭秘开源音乐下载技术的破局之道
Musicdl革新性全场景音乐解决方案:5个维度揭秘开源音乐下载技术的破局之道 【免费下载链接】musicdl Musicdl: A lightweight music downloader written in pure python. 项目地址: https://gitcode.com/gh_mirrors/mu/musicdl 在数字音乐产业蓬勃发展的今天…...
