锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
多线程de小事情
导航不迷路:
- 程序、进程以及线程的爱恨情仇
- 最简单实现多线程的方法(Thread)
- 简单易懂的多线程(通过实现Runnable接口实现多线程)
- 常用获取线程基本信息的方法(新手专属)
- 多线程,你觉得你安全了?(线程安全问题)
- 多线程别怕,有锁就安全;(解决线程安全问题)
文章目录
- 多线程de小事情
- 前言
- 死锁是なに啊?
- 代码如下:
- 解决死锁
- 代码如下:
- つづく…
前言
加上锁以后,确实可以解决多线程安全问题;但是有时候锁用不好,就会把自己锁住,陷入互相等待,这就是所谓的死锁;
死锁是なに啊?
多个线程持有共享资源,并且等待其他线程占有的资源才能进行,而导致两个或多个线程互相等待对方释放资源,都停止执行的情形;
代码如下:
public class DeadLock2 extends Thread{private Object car;//共享资源车private Object people;//共享资源人public boolean flag;//标识持有对象锁public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有辆车,但没人开");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (people) {System.out.println("有个人,但没车开");}}}else {synchronized (people) {System.out.println("有个人,但没车开");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (car) {System.out.println("有辆车,但没人开");}}}}}
测试类
public class DeadLock2Test {public static void main(String[] args) {Object car = new Object();Object people = new Object();DeadLock2 dl = new DeadLock2(car, people);DeadLock2 dl2 = new DeadLock2(car, people);dl.flag=true;dl2.flag = false;dl.start();dl2.start();}
}
运行效果
如图所示:两个线程都执行了一半,便处于等待状态;
解决死锁
导致死锁的原因是:一个代码块持有多个同步锁而造成的;
只要一个代码块,不要同时持有两个对象的同步锁就可以解决死锁问题;
代码如下:
public class DeadLock2 extends Thread{private Object car;//共享资源车private Object people;//共享资源人public boolean flag;//标识持有对象锁public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有辆车,但没人开");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (people) {System.out.println("有个人,但没车开");}}else {synchronized (people) {System.out.println("有个人,但没车开");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (car) {System.out.println("有辆车,但没人开");}}}}
测试类
package com.bjsxt.thread;public class DeadLock2Test {public static void main(String[] args) {Object car = new Object();Object people = new Object();DeadLock2 dl = new DeadLock2(car, people);DeadLock2 dl2 = new DeadLock2(car, people);dl.flag=true;dl2.flag = false;dl.start();dl2.start();}}
运行效果
如图所示:程序正常;只要改动一点点就可以轻松解决;
つづく…
感谢您的观看;后续仍然会不断更新多线程,最终会以生产者消费者模式的小项目结束;
敬请期待;
锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)相关推荐
- Java架构直通车——锁分段技术:微信如何扛住 10 亿用户同时修改微信号?
文章目录 引入 从HashMap到ConcurrentHashMap的转变:理解锁分段技术 HashMap的死循环 ConcurrentHashMap的实现方式---锁桶(或段) Concurrent ...
- redis setnx 分布式锁_手写Redis分布式锁
分布式锁使用场景 现在的系统都是集群部署,每个服务都不是单节点的了.比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3.库存服务需要扣减库存,扣减库存肯定需要锁吧,如果使用Lock或者 ...
- 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...
前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...
- 关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...
- 面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?
前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...
- 分布式锁:互斥锁、自旋锁、读写锁、悲观锁、乐观锁
前言 如何用好锁,也是程序员的基本素养之一了. 高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低. 所以,知道各种锁的开销,以及应用场景是很有必要的. 接下来,就谈一谈常见的 ...
- 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
前言 在编程世界里,「锁」更是五花八门,多种多样,每种锁的加锁开销以及应用场景也可能会不同. 如何用好锁,也是程序员的基本素养之一了. 高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则 ...
- 删除sybase里面的锁_一起来学习分布式锁
为什么要用分布式锁 我们先来看一个业务场景: 系统 A 是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存 足够了才会给用户下单. 由于 ...
- linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁
近日小温下APUE,发现Linux下的 fcntl 实现强制锁的功能好像都没试验过,简单做个测试. 首先用 fcntl 实现建议锁(Advisory locking),比较简单,贴个最简单的代码: # ...
最新文章
- bootstrap 获取表格修改的结果_bootstrap-table前端修改后台传来的数据重新进行渲染...
- 有趣、好玩、有料的网站收藏
- 大剑无锋之ArrayList中使用增强for循环能删除元素吗?【面试推荐】
- 商超小程序服务器配置,超市商超小程序在线开店的教程
- 深度学习2.0-28.其他训练tricks-Early Stopping,dropout等
- 用vSphere Client去建立虚拟机报MKS的错
- 大厂都搞不定的安全难题,被这家初创公司破解了!
- 斐讯k2php环境,斐讯K2 刷华硕固件 实现 单线复用(网络、IPTV走一根网线)
- 南科大副教授“跳槽”到深圳中学引热议!大学老师不香了吗?
- Android中连接MQTT服务器实现订阅主题并接收消息推送在通知栏显示(附代码下载)
- 转载文章-【工具】10分钟快速搭建属于自己的文档网站-来自掘金
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必知必会 排序 + 二叉树 部分!
- nvm安装node成功,npm安装失败问题
- 走进绚烂多彩的属性动画-Property Animation(上篇)
- 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-03备份和恢复
- 问道区块链_区块链学习_v1.0.0_持续更新。。。
- 励志人生语录英语加翻译
- excel模板编制-页眉页码
- ubuntu 命令打开html文件
- 案例:网购买到“劣质”产品,倒霉还能赚钱?
热门文章
- Spring Boot通过命令行启动发生FileNotFoundException
- SpringMVC jpa
- 不可能解开的谜题 (程序员修炼之道,评注者序)
- AB1601串口之bugs
- 计算机应用基础2010备课,《计算机应用基础》教案——office2010版-(2)
- mysql 自关联的子孙查询,Mysql自连接查询实例详解
- java新建测试程序_java – 如何创建一个CloseableHttpResponse对象来帮助测试?
- STL源代码分析(ch 1)组态1
- C++ Primer 5th笔记(chap 15 OOP)继承之类型转换
- [ATF]-ATF的代码学习篇-一篇就够了