锁(Lock)

1.死锁

(1). 概念 : 不同的线程分别占据着对方的资源不放弃,都在等待对方放弃自己需要的资源,这样就形成了死锁.

一旦出现死锁,程序即不会给出异常,也不会给出提示信息,只是所有线程处于阻塞状态,无法进行.

(2). 例子 : 一个人要一双筷子才能吃饭,而A和B各只有一根筷子,A说B把筷子给我我才能吃饭,B说A把筷子给我我才可以吃饭......

如 : 

public class DeadLock {public static void main(String[] args) {StringBuilder b1 = new StringBuilder();StringBuilder b2 = new StringBuilder();new Thread(new Runnable(){@Overridepublic void run() {synchronized (b1) {b1.append("我不是");b2.append("我是");}synchronized (b2){b1.append("fw");b2.append("fw");}}}).start();System.out.println(b1);System.out.println(b2);}}
控制台无输出

(3). 诱发死锁原因

  • 互斥条件
  • 占用且等待
  • 不可抢占
  • 循环等待

满足以上四个条件将会发生死锁.

(4). 如何解决 : 

死锁一旦出现,基本很难人为干预,只能尽量规避.

  • 互斥条件基本上无法破坏.因为线程需要互斥来解决安全问题.
  • 可以考虑一次性申请所有所需的资源,这样就不存在等待的问题.
  • 占用部分资源的线程在进一步申请其他资源时,如果申请不到,就将主动释放自己的占用的资源.
  • 可以将资源改为线性顺序.申请资源时,先申请序号较小的,避免循环等问题.

2.锁(Lock)(接口)

JDK5.0新增的特性,保证线程安全.与synchronized相比,锁可以提供多种方案.,更灵活强大.锁通过显式定义同步锁对象实现同步(ReentrantLock类的对象).同步锁使用Lock充当.

使用锁处理线程安全问题步骤 : 

  • 创建Lock的实例,确保多个线程共用同一个锁的实例.考虑将此对象声明为static final.
  • 执行lock方法,锁定对资源的调用.
  • 执行unlock方法,释放对共享数据的锁定.
public class ReentrantlockTest {public static void main(String[] args) {D d = new D();Thread t1 = new Thread(d, "线程-1");Thread t2 = new Thread(d, "线程-2");t1.start();t2.start();}}
class D implements Runnable{int change = 100;public static final ReentrantLock lock = new ReentrantLock();@Overridepublic void run() {while(true) {try{lock.lock();if (change > 0) {System.out.println(Thread.currentThread().getName() + "\t" + change);change--;} else {break;}}finally{lock.unlock();}}}}控制台
线程-1	100
线程-1	99
线程-1	98
线程-1	97
线程-1	96
线程-1	95
线程-1	94
线程-1	93
线程-1	92

3.Lock与synchronized同步方式的对比

  1. synchronized不管是同步方法还是同步代码块,在一对花括号结束之后,都需要释放对同步监视器的调用.
  2. Lock通过两个方法来控制需要被同步的方法,更灵活.
  3. Lock作为接口,提供了多种实现类,更适用于更加复杂的场景.

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

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

相关文章

CentOS 7.9上安装Redis

在CentOS 7.9上安装Redis通常涉及以下步骤: 下载Redis源代码: 首先,你需要从Redis官网或者使用Git克隆获取Redis的源代码。由于Redis通常不需要特定的操作系统版本,你可以使用任何版本的CentOS来安装Redis。 通过Git克隆源代码&am…

39.基于SpringBoot + Vue实现的前后端分离-无人智慧超市管理系统(项目 + 论文PPT)

项目介绍 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在环境要求不断提高的前提下,无人智慧超市管理系统建设也逐渐进入了信…

2024蓝桥杯省赛保奖突击班-Day2-前缀和、差分、尺取_笔记_练习题解

3月25日-课堂笔记 前缀和预处理 O ( n ) \mathcal{O}(n) O(n) s[1] a[1]; for(int i 2; i < n; i)s[i] s[i - 1] a[i];利用前缀和查询区间和 O ( 1 ) O(1) O(1) long long calc(int l, int r) {return l 1 ? s[r] : s[r] - s[l - 1]; }差分序列的求法 c[1] a[…

电子元器件商城模式的安全与风险管理

电子元器件商城模式的安全与风险管理至关重要&#xff0c;特别是在当前数字化和网络化的环境下。以下是一些关键的安全考虑和风险管理策略&#xff1a; 数据安全与隐私保护&#xff1a; 保护客户的个人和交易数据是至关重要的。使用加密技术来保护数据传输和存储&#xff0c;确…

Qt Creator 与 VS 开发 Qt 项目的详细比较(详细版)

Qt Creator 与 VS 开发 Qt 项目的详细比较 简介 Qt 是一个功能强大、跨平台的应用程序框架&#xff0c;可用于开发各种类型的应用程序&#xff0c;包括桌面应用程序、移动应用程序和嵌入式应用程序。 Visual Studio 是 Microsoft 开发的集成开发环境 (IDE)&#xff0c;可用于…

Linux内网提权

一、SUID提权 前提条件&#xff1a; &#xff08;1&#xff09;SUID仅对二进制有效&#xff08;2&#xff09;执行者对于该程序需要有x的可执行权限&#xff08;3&#xff09;本权限仅在程序的执行过程中有效 1、设置SUID权限&#xff1a;&#xff08;root权限&#xff09; …

AI新工具 小模型也有大智慧Qwen1.5-MoE;大模型动态排行榜;马斯克更新Grok-1.5

✨ 1: Qwen1.5-MoE 阿里巴巴一款小型 MoE 模型&#xff0c;只有 27 亿个激活参数&#xff0c;但性能与最先进的 7B 模型&#xff08;如 Mistral 7B 和 Qwen1.5-7B&#xff09;相匹配。 Qwen1.5-MoE是一个使用混合专家模型&#xff08;Mixture-of-Experts&#xff0c;MoE&…

小型分布式文件存储系统GoFastDfs应用简介

前言 最近稍微留意了一下各个文件存储系统的协议&#xff0c;发现minio是LGPLV3, 而fastdfs 是GPL3,这些协议其实对于商业应用是一个大坑。故而寻找一些代替品。 go-fastdfs就是其中之一&#xff0c;官网在&#xff1a; go-fastdfs 具体应用 其实可以直接查看官网教程的。 下…

【学习】JMeter和Postman两种测试工具的主要区别有哪些

Postman和JMeter都是常用的API测试工具&#xff0c;但它们之间存在一些不同之处。以下是Postman和JMeter的主要区别&#xff1a; 语言支持 Postman是一个基于Chrome的应用程序&#xff0c;因此它使用JavaScript作为编程语言。这意味着你可以使用JavaScript来编写测试脚本和断…

element-ui升级到element-plus兼容性问题处理

1.报错&#xff1a;dropdown-item.mjs:42 Uncaught (in promise) TypeError: Cannot destructure property ‘onItemEnter’ of ‘(0 , vue__WEBPACK_IMPORTED_MODULE_0__.inject)(…)’ as it is undefined. 对应的源码位置如下&#xff0c;是elemen-plus中的dropdown-item文件…

【2024系统架构设计】案例分析- 4 嵌入式

目录 一 基础知识 二 真题 一 基础知识 1 基本概念 ◆系统可靠性是系统在规定的时间内及规定的环境条件下,完成规定功能的能力,也就是系统无故障运行的概率。或者,可靠性是软件系统在应用或系统错误面前,在意外或错误使用的情况下维持软件系统的功能特性的基本能力。

基于springboot+vue+Mysql的家政服务管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…

QT 常见报错解决记录

窗体一闪而过 解决办法&#xff0c;为其开辟内存空间 int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow mainWindow;int resmainWindow.exec();if(resQDialog::Accepted){ExamDialog *exam;examnew ExamDialog;}else{return 0;}// ExamDialog c;// …

软件工程学习笔记14——案例解析篇

一、大型开源项目对软件工程的应用 以VS Code为例&#xff0c;看大型开源项目是如何应用软件工程的。 软件工程的核心&#xff0c;就是围绕软件项目开发&#xff0c;对开发过程的组织&#xff0c;对方法的运用&#xff0c;对工具的使用。 所以当我们去观察一个软件项目&#…

Linux(CentOS7.5) 安装部署 Python3.6(超详细!包含 Yum 源配置!)

文章目录 1.配置 Yum 源2.下载 Python3 包3. 解压4.安装依赖环境5.安装出错场景 6.创建软链接7.配置 Python3 的环境变量8.验证补充&#xff1a;安装 openssl-devel补充&#xff1a;pip3 源配置 1.配置 Yum 源 # 注意&#xff01;&#xff01;&#xff01;请先切换到 root 账号…

Web框架开发-BBS项目预备知识

一、简介 博客系统(cnblog) https://www.cnblogs.com/ 1.django ORM (object relation mapping 对象关系映射) 表 = 类 对象 = 记录跨表查询 分组查询 annotate() 聚合查询 aggregate(*args, **kwargs) 2.bootstrap3.Ajax (jquery javascript) --- javascript 去写…

FPGA Artix7 Bootloader App Python升级

文章目录 软硬环境复现官方 srec_spi_bootloader例子简介Vivado硬件部分存储划分Vitis 嵌入式 BootVitis 嵌入式 Appelf转换srec合并boot和app得到mcs文件下载测试过程分析 基础知识BIT MCS HEX BINBit SwappingSREC 文件格式Vivado约束 串口Boot地址划分链接脚本修改Github Li…

在银河麒麟系统中安装nginx

1.先下载nginx安装包&#xff0c;先去官网下载所需安装包 nginx: download https://nginx.org/en/download.html2.切换到/usr/local目录下面&#xff0c;上传nginx并解压tar -zxvf nginx-1.24.0.tar.gz cd /usr/local tar -zxvf nginx-1.24.0.tar.gz3.执行 ./configure 配置命…

五、基于KubeAdm搭建多节点K8S集群

如需查阅上一步骤,请点击下面链接:四、戴尔R630本地服务器Linux Centos7.9系统安装docker-ce-20.10.10-3.el7版本-CSDN博客文章浏览阅读727次,点赞12次,收藏13次。1、准备工作3、Linux Centos7.9系统的iDRAC远程管理、网络设置、SecureCRT远程登录终端、企业级静态ip地址配…