Java并发编程的艺术 记录(一)
2024-08-30 13:13:47
模拟死锁
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命令查看的死锁状态,红色框内是死锁发生的类文件及行号。
最新文章
- Fiddler将笔记本设置代理,抓取手机网络请求包
- MySQL学习笔记十六:锁机制
- 里氏替换原则(Liskov Substitution Principle)
- html5标签figure、figcaption
- linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)
- QTabWiget Change Color 改变颜色(每个QWidget都有一个自己的调色板palette,设置它的颜色,然后setAutoFillBackground即可)
- 编程算法 - 扑克牌的顺子 代码(C)
- 拦截QWebView弹出窗口
- Apriori算法-位运算-C语言
- 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
- mongoDB连接数据库
- 20165311 《网络对抗技术》 Kali安装
- 不会点git真不行啊.
- python2 python3 转换,兼容
- 『TensorFlow』读书笔记_AlexNet
- GPU知识了解
- My strength (C-A-R)
- Long类型转json时前端js丢失精度解决方案
- 单元测试UI
- ubuntu 安装oracle客户端
热门文章
- Hive_Hive的安装
- Storm编程入门API系列之Storm的Topology多个Workers数目控制实现
- JS=和==和===的区别
- 《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识
- CF747D Winter Is Coming
- 利用nodejs读取数据库数据生成树结构的json数据
- ThreadLocal使用,应用场景,源码实现,内存泄漏
- Invalid bound statement (not found): com.ros.dao.LogMapper.insert
- Android(java)学习笔记139:Android中Menu的使用(静态 和 动态)
- 【原创】最有效解决IE8 position兼容性问题