如何构建一个死锁?
来源:互联网 发布:长阳淘宝客服 编辑:程序博客网 时间:2024/05/16 12:25
程序中的死锁指的是两个或两个以上的线程,相互等待对方释放某个锁,而造成无限等待的一种情况
如何构建死锁?
以下就是一个死锁的例子
package MultiThread;/** * Java program to create a deadlock by imposing circular wait. * * @author William * */public class DeadLock { private class Running1 implements Runnable { /* * This method request two locks, first String and then Integer */ @Override public void run() { while (true) { synchronized (String.class) { System.out.println("Thread1 Aquired lock on String.class object"); synchronized (Integer.class) { System.out.println("Thread1 Aquired lock on Integer.class object"); } } } } } private class Running2 implements Runnable { /* * This method also requests same two lock but in exactly * Opposite order i.e. first Integer and then String * This creates potential deadlock, if one thread holds String lock * and other holds Integer lock and they wait for each other, forever */ @Override public void run() { while (true) { synchronized (Integer.class) { System.out.println("Thread2 Aquired lock on Integer.class object"); synchronized (String.class) { System.out.println("Thread2 Aquired lock on String.class object"); } } } } } public static void main(String[] args) { DeadLock deadLock = new DeadLock(); Running1 r1 = deadLock.new Running1(); Running2 r2 = deadLock.new Running2(); Thread thread1 = new Thread(r1); Thread thread2 = new Thread(r2); thread1.start(); thread2.start(); }}
Console output :Thread1 Aquired lock on String.class objectThread2 Aquired lock on Integer.class object无限等待
在上面这个例子中,我们有两个线程,以相反的顺序去获取两个锁,最后陷入了Thread1持有String锁,等待Integer锁,Thread2持有Integer锁,等待String锁的无限等待,即死锁情景
如何避免死锁?
避免死锁的关键在于应使不同线程获取锁的顺序保持一致,例如都先获取String锁,再获取Integer锁,我们可以做如下修改
package MultiThread;/** * Java program to create a deadlock by imposing circular wait. * * @author William * */public class DeadLock { private class Running1 implements Runnable { /* * This method request two locks, first String and then Integer */ @Override public void run() { while (true) { synchronized (String.class) { System.out.println("Thread1 Aquired lock on String.class object"); synchronized (Integer.class) { System.out.println("Thread1 Aquired lock on Integer.class object"); } } } } } private class Running2 implements Runnable { /* * This method requests same two lock in the same * order i.e. first String and then Integer * This will not create any deadlock risk */ @Override public void run() { while (true) { synchronized (String.class) { System.out.println("Thread2 Aquired lock on Integer.class object"); synchronized (Integer.class) { System.out.println("Thread2 Aquired lock on String.class object"); } } } } } public static void main(String[] args) { DeadLock deadLock = new DeadLock(); Running1 r1 = deadLock.new Running1(); Running2 r2 = deadLock.new Running2(); Thread thread1 = new Thread(r1); Thread thread2 = new Thread(r2); thread1.start(); thread2.start(); }}
Console output :Thread1 Aquired lock on String.class objectThread1 Aquired lock on Integer.class objectThread1 Aquired lock on String.class objectThread1 Aquired lock on Integer.class objectThread2 Aquired lock on String.class objectThread2 Aquired lock on Integer.class object...
0 0
- 如何构建一个死锁?
- 一个多线程死锁案例,如何避免及解决死锁问题?
- java中如何写一个死锁例子
- 如何写一个死锁的java程序
- 如何构建一个 LFS 系统
- 如何构建一个 LFS 系统
- 如何手动构建一个COM
- DirectX如何构建一个太阳系
- 如何构建一个分布式爬虫
- 如何写出一个会产生死锁的程序
- 如何构建一个优秀的销售团队?
- 如何构建一个QTP测试框架?
- [qtp]如何构建一个QTP测试框架
- 如何构建一个完整的WEB服务器
- 如何利用VC++构建一个游戏框架
- 我是如何构建一个持续发展的项目
- 我是如何构建一个持续发展的项目
- 如何构建一个高效的敏捷团队
- 深入理解BootStrap Item3 -- 基础排版
- 欢迎使用CSDN-markdown编辑器
- 大话设计模式读后感-工厂模式
- sql cte 递归用法
- 机器学习中overfitting的理解
- 如何构建一个死锁?
- Android获取TextView的长度
- PTA 11-散列2 Hashing
- 微信公众号通讯录同步
- week10---11月13日 JS基础(五)
- DIY 二叉树的先序非递归遍历
- maven+springMVC+mybatis+junit详细搭建过程
- ——黑马程序员——OC中简单单列模式的实现
- 用SQL语句写某一月份的日历