死锁是指:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

同步代码块不要嵌套,因为,嵌套容易死锁,避免死锁的出现,不要进行同步代码块的嵌套

package com.yy.syn;
//只有获得到一双筷子才可以吃
public class Demo5_DeadLock {private static String s1 = "筷子1";private static String s2 = "筷子2";public static void main(String[] args) {new Thread(){                               //第一个线程Thread-0,在上面,所以,它先开启,先开始执行,执行的机会多public void run(){while(true){synchronized (s1) {         //系统先拿到s1System.out.println(getName() + "...获取" + s1 + "等待" + s2 );//之后,执行这句话synchronized (s2) {         //正准备获取s2的时候,第二条线程启动System.out.println(getName() + "...拿到" + s2 +"开吃" );}}}}}.start();new Thread(){public void run(){while(true){synchronized (s2) {         //第二条线程获取到s2System.out.println(getName() + "...获取" + s2 + "等待" + s1 );//之后,执行这句话synchronized (s1) {         //然后,再准备去获取s1,但是s1已经被第一条线程获取,第一条线程并未释放s1System.out.println(getName() + "...拿到" + s1 +"开吃" );}}}}}.start();}
}
//之后,第一条线程获得了s1,第二条线程获取了s2,第一条线程想获取s2,但是,s2被第二条线程所获取,而第二条线程想获取s1,但是s1被第一条线程所获取,所以,两条线程开始僵持,最后造成死锁
//但是,也会有一种发生概率极低的情况,一种理想状态,即 第一条线程先拿到s1然后输出一句话,然后再拿到s2输出一句话,然后再释放s1,释放s2;然后,第二条线程开始获取s2,输出,然后再获取s1,输出

Java——多线程(死锁)相关推荐

  1. java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...

    java多线程死锁 编写高质量代码:改善Java程序的151个建议 第1章 Java开发中的通用方法和准则 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的 ...

  2. java多线程--死锁

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...

  3. Java多线程死锁例子

    目录 一.产生死锁的原因 二.如何避免死锁 一.产生死锁的原因 发生死锁的情况: 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况,就是,两个线程互相等待着对象释放锁,一直这样僵持下去, ...

  4. Java 多线程 —— 死锁与锁的错误用法

    引言 死锁状态的大致情况是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁 ,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图: 一.模拟一个死锁 public cl ...

  5. JAVA多线程死锁模拟

    多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束.这是从网上其他文档看到的死锁产 ...

  6. 深耕Java多线程 - 死锁、活锁、饥饿

    文章目录 1. 什么是死锁? 2. 死锁产生的四个必要条件是什么? 3. 如何定位死锁? 3.1 jps+jstack 3.2 jconsole 4. 如何避免死锁? 5. 活锁 6. 饥饿 1. 什 ...

  7. java多线程-死锁的一些问题

    **死锁:**不同的线程相互占用对方的资源不放弃并等待对方放弃自己需要的资源,形成了僵局,从而陷入阻塞状态 必要条件 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: 互斥:至少有一个资源必须 ...

  8. Java多线程--死锁例子

    package qzy.thread.deadLock;/*** @描述模拟死锁** 形成死锁的四个必要条件是什么** 1.互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程 ...

  9. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

最新文章

  1. 如何用Python快速抓取Google搜索?
  2. Linux下多路复用IO接口epoll/select/poll的区别
  3. 图书管理系统python源代码-Python实现图书管理系统
  4. Dubbo整合hystrix
  5. 16.如何做到webpack打包vue项目后,可以修改配置文件
  6. mysql user_tab_cols_最新Oracle 和 mysql 的对比参照----开发篇(转)
  7. STL容器之deque
  8. 95-848-020-源码-AKKA-Akka与Actor 模型
  9. Python中的用for,while循环遍历文件实例
  10. mysql主从同步开启后的iptables的设定问题
  11. docker-compose搭建EFK,继上篇使用filebeat+es对日志文件的过滤
  12. js判断是否为手机浏览器
  13. mysql常用语句之DQL:查询语句
  14. gis 六边形网格_六边形网格快速定位
  15. Linux文本比较指令(diff,cmp)详解
  16. 全国天气查询API接口
  17. Kafka从零开始 (Kafka是什么?)
  18. react版数组遍历
  19. 如何成为一名优秀的程序员(一)
  20. 数据结构中二叉树的度

热门文章

  1. JS中的兼容问题总结
  2. 前端也要会的数据结构 (不定期更新篇)
  3. form中action属性后面?传递参数 获取不到
  4. Git初始化配置以及配置github
  5. 物联网架构成长之路(24)-Docker练习之Compose容器编排
  6. link-cut-tree 简单介绍
  7. 关于Ubuntu使用笔记
  8. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...
  9. C++服务器设计(七):聊天系统服务端实现
  10. Android WifiDisplay分析一:相关Service的启动