模拟死锁

package com.gjjun.concurrent;

/**
* 模拟死锁,来源于《Java并发编程的艺术》
* @Author gjjun
* @Create 2018/8/12
**/
public class DeadLockDemo { private static String A = "A";
private static String B = "B"; public static void main(String[] args) { DeadLockDemo deadLockDemo = new DeadLockDemo();
deadLockDemo.deadLock();
} /**
* 下面代码将发生死锁,原因是线程0将A资源锁定,之后线程1将B资源锁定,
* 之后线程1调用A资源,但是是锁定状态,所以等待A资源释放,但是A资源在2s后需要B
* 资源,但是B资源却等待A资源释放,所以形成了相互依赖。
*
* 可以在控制行输入命令 jps,查看类的id,之后使用jstack id查看是否发生了死锁
*
*
* 避免死锁的方式:
* 1.避免一个线程同时获取多个锁。
* 2.避免一个线程同时占用多个资源,尽量保证一个锁一个资源。
* 3.尝试使用定时锁,使用lock.tryLock(timeout)来代替使用
* 4.对于数据库锁,加锁和解锁必须在一个数据库连接池里。
*/
private void deadLock() {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (A) {
try {
System.out.println("A");
Thread.currentThread();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("1");
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (B) {
try {
System.out.println("B");
Thread.currentThread();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (A) {
System.out.println("2");
}
}
}
});
thread1.start();
thread2.start();
}
}

下面是使用jstack命令查看的死锁状态,红色框内是死锁发生的类文件及行号。

最新文章

  1. Fiddler将笔记本设置代理,抓取手机网络请求包
  2. MySQL学习笔记十六:锁机制
  3. 里氏替换原则(Liskov Substitution Principle)
  4. html5标签figure、figcaption
  5. linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)
  6. QTabWiget Change Color 改变颜色(每个QWidget都有一个自己的调色板palette,设置它的颜色,然后setAutoFillBackground即可)
  7. 编程算法 - 扑克牌的顺子 代码(C)
  8. 拦截QWebView弹出窗口
  9. Apriori算法-位运算-C语言
  10. 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
  11. mongoDB连接数据库
  12. 20165311 《网络对抗技术》 Kali安装
  13. 不会点git真不行啊.
  14. python2 python3 转换,兼容
  15. 『TensorFlow』读书笔记_AlexNet
  16. GPU知识了解
  17. My strength (C-A-R)
  18. Long类型转json时前端js丢失精度解决方案
  19. 单元测试UI
  20. ubuntu 安装oracle客户端

热门文章

  1. Hive_Hive的安装
  2. Storm编程入门API系列之Storm的Topology多个Workers数目控制实现
  3. JS=和==和===的区别
  4. 《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识
  5. CF747D Winter Is Coming
  6. 利用nodejs读取数据库数据生成树结构的json数据
  7. ThreadLocal使用,应用场景,源码实现,内存泄漏
  8. Invalid bound statement (not found): com.ros.dao.LogMapper.insert
  9. Android(java)学习笔记139:Android中Menu的使用(静态 和 动态)
  10. 【原创】最有效解决IE8 position兼容性问题