线程死锁浅谈
来源:互联网 发布:知乎 法国亚马逊 编辑:程序博客网 时间:2024/06/10 21:10
死锁:当一个线程等待由另一个线程持有锁,而后者正在等待已被第一个线程持有的锁,就会发生死锁。
程序员为啥要关注这个死锁问题呢?
这就是因为神秘的JAVA虚拟机(JVM)不检测也不试图避免这种情况。
程序员为啥要关注这个死锁问题呢?
这就是因为神秘的JAVA虚拟机(JVM)不检测也不试图避免这种情况。
案例:
public class DeadLock {
public void testDealLock() {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
}
//test
public static void main(String[] args) {
new DeadLock().testDealLock();
}
//内部类
class MyThread implements Runnable{
//资源
private Object object1 = new Object();
private Object object2 = new Object();
private boolean flag = true;
@Override
public void run() {
if (flag) {
flag = false;
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2");
}
}
} else {
flag = true;
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2--");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1--");
}
}
}
}
}
}
public void testDealLock() {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
}
//test
public static void main(String[] args) {
new DeadLock().testDealLock();
}
//内部类
class MyThread implements Runnable{
//资源
private Object object1 = new Object();
private Object object2 = new Object();
private boolean flag = true;
@Override
public void run() {
if (flag) {
flag = false;
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2");
}
}
} else {
flag = true;
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2--");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1--");
}
}
}
}
}
}
--结果
Thread-0 object1
Thread-1 object2--
Thread-1 object2--
原因是:
第一个线程获取object1的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第二个线程获取object2的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第一个线程休眠结束,准备获取object2资源,发现object2资源被第二个线程锁住,那么就开始等待
第二个线程休眠结束,准备获取object1资源,发现object1资源被第一个线程锁住,也开始等待
就这样,你等待我,我等待你,大家玩完,变成了死锁
0 0
- 线程死锁浅谈
- 浅谈线程同步的死锁
- 浅谈线程同步的死锁
- 浅谈Linux中的 线程死锁
- 浅谈死锁
- 浅谈死锁
- 浅谈死锁
- 浅谈死锁
- 浅谈死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 线程死锁
- 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools:
- [Android]使用RecyclerView替代ListView
- 研究C语言的参数执行顺序
- C/c++程序内存分配
- AudioTrack到AudioFlinger再到AudioPolicyService
- 线程死锁浅谈
- WebSphere+db2使用PROPAGATION_REQUIRES_NEW事务策略因为的系
- Spark性能调优
- 堆和栈的区别
- 实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组
- SerialControl.start not connected
- <java API源码初体验>1---collection集合之ArrayList原理分析
- Hibernate多对多双向关联,Annotation与映射文件方式。解决中间表无法插入数据。
- Pentaho Work with Big Data(四)—— 转换Hive里的数据