多线程de小事情

导航不迷路:

  1. 程序、进程以及线程的爱恨情仇
  2. 最简单实现多线程的方法(Thread)
  3. 简单易懂的多线程(通过实现Runnable接口实现多线程)
  4. 常用获取线程基本信息的方法(新手专属)
  5. 多线程,你觉得你安全了?(线程安全问题)
  6. 多线程别怕,有锁就安全;(解决线程安全问题)

文章目录

  • 多线程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();}}

运行效果

如图所示:程序正常;只要改动一点点就可以轻松解决;


つづく…

感谢您的观看;后续仍然会不断更新多线程,最终会以生产者消费者模式的小项目结束;
敬请期待;

锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)相关推荐

  1. Java架构直通车——锁分段技术:微信如何扛住 10 亿用户同时修改微信号?

    文章目录 引入 从HashMap到ConcurrentHashMap的转变:理解锁分段技术 HashMap的死循环 ConcurrentHashMap的实现方式---锁桶(或段) Concurrent ...

  2. redis setnx 分布式锁_手写Redis分布式锁

    分布式锁使用场景 现在的系统都是集群部署,每个服务都不是单节点的了.比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3.库存服务需要扣减库存,扣减库存肯定需要锁吧,如果使用Lock或者 ...

  3. 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  4. 关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  5. 面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  6. 分布式锁:互斥锁、自旋锁、读写锁、悲观锁、乐观锁

    前言 如何用好锁,也是程序员的基本素养之一了. 高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低. 所以,知道各种锁的开销,以及应用场景是很有必要的. 接下来,就谈一谈常见的 ...

  7. 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

    前言 在编程世界里,「锁」更是五花八门,多种多样,每种锁的加锁开销以及应用场景也可能会不同. 如何用好锁,也是程序员的基本素养之一了. 高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则 ...

  8. 删除sybase里面的锁_一起来学习分布式锁

    为什么要用分布式锁 我们先来看一个业务场景: 系统 A 是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存 足够了才会给用户下单. 由于 ...

  9. linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁

    近日小温下APUE,发现Linux下的 fcntl 实现强制锁的功能好像都没试验过,简单做个测试. 首先用 fcntl 实现建议锁(Advisory locking),比较简单,贴个最简单的代码: # ...

最新文章

  1. bootstrap 获取表格修改的结果_bootstrap-table前端修改后台传来的数据重新进行渲染...
  2. 有趣、好玩、有料的网站收藏
  3. 大剑无锋之ArrayList中使用增强for循环能删除元素吗?【面试推荐】
  4. 商超小程序服务器配置,超市商超小程序在线开店的教程
  5. 深度学习2.0-28.其他训练tricks-Early Stopping,dropout等
  6. 用vSphere Client去建立虚拟机报MKS的错
  7. 大厂都搞不定的安全难题,被这家初创公司破解了!
  8. 斐讯k2php环境,斐讯K2 刷华硕固件 实现 单线复用(网络、IPTV走一根网线)
  9. 南科大副教授“跳槽”到深圳中学引热议!大学老师不香了吗?
  10. Android中连接MQTT服务器实现订阅主题并接收消息推送在通知栏显示(附代码下载)
  11. 转载文章-【工具】10分钟快速搭建属于自己的文档网站-来自掘金
  12. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必知必会 排序 + 二叉树 部分!
  13. nvm安装node成功,npm安装失败问题
  14. 走进绚烂多彩的属性动画-Property Animation(上篇)
  15. 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-03备份和恢复
  16. 问道区块链_区块链学习_v1.0.0_持续更新。。。
  17. 励志人生语录英语加翻译
  18. excel模板编制-页眉页码
  19. ubuntu 命令打开html文件
  20. 案例:网购买到“劣质”产品,倒霉还能赚钱?

热门文章

  1. Spring Boot通过命令行启动发生FileNotFoundException
  2. SpringMVC jpa
  3. 不可能解开的谜题 (程序员修炼之道,评注者序)
  4. AB1601串口之bugs
  5. 计算机应用基础2010备课,《计算机应用基础》教案——office2010版-(2)
  6. mysql 自关联的子孙查询,Mysql自连接查询实例详解
  7. java新建测试程序_java – 如何创建一个CloseableHttpResponse对象来帮助测试?
  8. STL源代码分析(ch 1)组态1
  9. C++ Primer 5th笔记(chap 15 OOP)继承之类型转换
  10. [ATF]-ATF的代码学习篇-一篇就够了