看代码:
public class TestDeadLock implements Runnable{
int flag = 1;
static Object o1 = new Object(); //资源1,也称为锁
static Object o2 = new Object(); //资源2,也称为锁
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
//锁,是个对象,给谁上锁,是给synchronized语句中的代码上锁,
public void run() {
if(flag == 1){
synchronized(o1)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println("t1 succeed");
}
}
}
if(flag == 0){
synchronized(o2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println("t2 succeed");
}
}
}
}
}
(1)线程t1(td1)就相当于一个人。
(2)对象o1就相当于一把锁。锁也可称为独占资源。
(3)synchronized(o1)就相当于屋里的财富。
当线程t1运行到synchronized(o1)中,就相当于这个人走进了屋里,同时把屋的门给锁定(即o1锁定),当线程t1走出synchronized(o1)的代码段后,就相当于这个人走出了屋,同时把锁释放掉,别人(如t2)就可以拥有锁,可以进屋。
我们来看上端代码,t1和t2两个线程,假设首先t1进入run()方法,然后判断flag是否为1,为1则利用对象o1将下面那段代码锁住,与此同时t2进入run()方法,判断flag,为0,则利用o2将下面那段代码锁住,再回过头来,此时t1继续向下执行,执行到synchronized(o2)这,此时o2对象已经被t2锁住,所以o1开始等待o2对象释放锁标记,同理,t2继续往下执行,执行到synchronized(o1)这,也就开始等待o1对象释放锁标记.这样互相等待,就产生死锁.
注意:如果我把static Object o1 = new Object();前面的static去掉的话,那么就不会发生死锁了,这是因为,这两个线程都有自己的o1,即锁不再是公用的了,所以不会发生死锁了.
分享到:
相关推荐
oracle锁讲解笔记 oracle锁讲解笔记
而对于MySQL中的锁,我们将会介绍基础锁和高级锁的分类、锁的应用场景、锁的竞争和冲突问题、锁的常见应用案例、以及针对锁的调优方法等几个重要话题。我们会具体探讨到排它锁和共享锁的定义、意义和实现;介绍到锁...
Mysql事务以及锁原理讲解,方便大家了解mysql事务和锁的原理
1。使用pthread_cond_wait前要先加锁 2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活 3。pthread_cond_wait被激活后会再...加锁(和等待线程用同一个锁) 2。pthread_cond_signal发送信号 3。解锁
商务工作讲解PPT,为你解说商务工作的主要内容,可以用于技术培训、新人培训等场合。商务宫锁讲解PPT内容包括招投标全流程详解、合同签订详解等。
分布式锁的原理、实现方式、应用场景,经典学习视频。
Mysql事务以及锁原理讲解 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。 对于上面的转账场景,一致...
上传到CSDN的项目资源,都会有一份完整项目设计文档和一份项目演示的功能讲解视频。 项目专栏地址: https://blog.csdn.net/xiaolong1126626497/category_10192120.html B站视频首页:...
分布式锁讲解ppt
详细描述数据库锁和事务的内容,其中包括各种类型的锁的讲述,事务的控制
宾馆roca[诺卡]门锁接口 宾馆管理系统开发电子门锁接口 电子门锁二次开发接口
关于闩锁效应很好的一个课件,是我在网上下载整理的很好的东西,希望多大家有用,顺便赚点分
由D触发器设计的停电自锁电路电子研发,维修,学习附电路原理讲解,
介绍数据库事务的定义和事务带来的问题,详细讲解乐观锁与悲观锁的区别
系统介绍mysql锁机制
Hibernate乐观锁和悲观锁分析,针对在使用HIBERNATE时怎么配置乐观锁进行了详细的范例讲解
本设计主要是基于STM32F407作为主控芯片,通过搭载一个3.2寸的LCD屏,继电器和一个电磁铁锁头组成了一个基于STM32的电子密码锁。...屏幕校准成功屏幕会显示Adjust ...资料内容:开发文档,视频讲解,源代码,硬件连接图
常用经典算法及讲解 包括:贪婪算法,分而治之算法,动态规划,回溯,分枝定界 以及八女王问题,卡车更新问题 1. 最小数字子串 2. 邮票面值 3. 字符移动 4. 子集定和问题 5. 素数方阵 6...
今天小编就为大家分享一篇关于Java线程公平锁和非公平锁的差异讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
自锁电路的实现的原理讲解和原理图,从根本上实现电路的自锁。