Java死锁的例子

死锁

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。

//代码一

 1 class Deadlocker {
 2  int field_1;
 3  private Object lock_1 = new int[1];
 4  int field_2;
 5  private Object lock_2 = new int[1];
 6
 7  public void method1(int value) {
 8   “synchronized” (lock_1) {
 9    “synchronized” (lock_2) {
10     field_1 = 0; field_2 = 0;
11    }
12   }
13  }
14
15  public void method2(int value) {
16   “synchronized” (lock_2) {
17    “synchronized” (lock_1) {
18     field_1 = 0; field_2 = 0;
19    }
20   }
21  }
22 }
23  

参考代码一,考虑下面的过程:

◆ 一个线程(ThreadA)调用method1()。

◆ ThreadA在lock_1上同步,但允许被抢先执行。

◆ 另一个线程(ThreadB)开始执行。

◆ ThreadB调用method2()。

◆ ThreadB获得lock_2,继续执行,企图获得lock_1。但ThreadB不能获得lock_1,因为ThreadA占有lock_1。

◆ 现在,ThreadB阻塞,因为它在等待ThreadA释放lock_1。

◆ 现在轮到ThreadA继续执行。ThreadA试图获得lock_2,但不能成功,因为lock_2已经被ThreadB占有了。

◆ ThreadA和ThreadB都被阻塞,程序死锁。

当然,大多数的死锁不会这么显而易见,需要仔细分析代码才能看出,对于规模较大的多线程程序来说尤其如此。好的线程分析工具,例如JProbe Threadalyzer能够分析死锁并指出产生问题的代码位置。

时间: 2024-08-09 05:25:12

Java死锁的例子的相关文章

构造几个死锁的例子(Java )

目录 构造几个死锁的例子(Java ) 1 2 3 构造几个死锁的例子(Java ) 1 public class Deadlock { public static void main(String[] args) { final A a1 = new A("a1"); final A a2 = new A("a2"); a1.setA(a2); a2.setA(a1); Thread t1 = new Thread(()->{ a1.method1(); }

Java死锁范例以及如何分析死锁(转载自ImportNew)

本文由 ImportNew - 范琦琦 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. 死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Java死锁排查和Java CPU 100% 排查的步骤整理

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

Java死锁排查和Java CPU 100% 排查的步骤整理(转)

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

Java死锁举例

死锁: 在多线程竞争使用共享资源的情况下,就有可能出现死锁的情况.比如,当一个线程等待另一个线程所持有的锁时,那个线程又可能在等待第一个线程所持有的锁.此时,这两个线程会陷入无休止的相互等待状态,这种情况就称为死锁. 产生死锁的四个必要条件: 1.互斥条件.进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有. 2.请求和保持条件.当进程因请求资源而阻塞时,对已获得的资源保持不放. 3.不剥夺条件.进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放. 4.环

java反射小例子

package com.txwsqk.reflect; public class Car { private String brand; private String color; private int maxspeed; public Car(){} public Car(String brand, String color, int maxspeed){ this.brand = brand; this.color = color; this.maxspeed = maxspeed; }

Java泛型代码例子

Java泛型代码例子 一篇代码胜过千言万语 package com.apkkids.javalanguage; import java.util.ArrayList; import java.util.List; /** * @author wxb * Java泛型例子 */ public class GenericTest { //泛型接口 public interface MyCollection<T>{ public T get(int position ); public T add(

java memcached 简单例子 使用spymemcached客户端

只是一个简单的例子,没有太多需要解释的. 需要注意的是,如果存对象的话,对象需要实现序列化的接口. 引用了一个jar:spymemcached-2.10.3.jar 直接上代码: 1 package memTest; 2 3 import net.spy.memcached.MemcachedClient; 4 5 6 import java.io.IOException; 7 import java.io.Serializable; 8 import java.net.InetSocketAd

使用java注解的例子有没有

使用java注解的例子 参考文档:http://www.cnblogs.com/pepcod/archive/2013/02/20/2918719.html http://www.shaoqun.com/a/53928.aspx,最后面介绍了权限调用 spring的依赖注入bean spring调用接口的权限验证,比如needRoles