看代码:
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数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...
记录锁锁定特定的行,间隙锁锁定索引之间的间隙,临键锁结合了记录锁和间隙锁,防止幻读,插入意向锁则表明事务打算在指定位置插入数据。 4. 从锁的态度分类,有悲观锁和乐观锁。悲观锁假定并发操作会导致冲突,...
本文将深入讲解这两种锁的概念、工作原理以及如何在C语言中使用它们。 首先,互斥锁(Mutex)是一种基本的线程同步机制,用于保护共享资源不被多个线程同时访问。当一个线程获得互斥锁后,其他试图获取同一锁的线程...
本视频资料深入浅出地讲解了分布式锁的原理、实现方式以及其在实际应用中的场景。 首先,我们来了解分布式锁的基本原理。分布式锁的目的是解决在分布式环境下,多节点并发访问同一资源时可能出现的数据不一致问题。...
商务工作讲解PPT,为你解说商务工作的主要内容,可以用于技术培训、新人培训等场合。商务宫锁讲解PPT内容包括招投标全流程详解、合同签订详解等。
在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...
上传到CSDN的项目资源,都会有一份完整项目设计文档和一份项目演示的功能讲解视频。 项目专栏地址: https://blog.csdn.net/xiaolong1126626497/category_10192120.html B站视频首页:...
Mysql事务以及锁原理讲解 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。 对于上面的转账场景,一致...
深入讲解CAS自旋锁的实现机理和原理 CAS(Compare and Swap)是实现自旋锁或乐观锁的核心操作,它的出现是为了解决原子操作的问题。在多线程环境下,原子操作是保证线程安全的重要手段。CAS操作的实现很简单,就是...
描述中提到的“电子研发,维修,学习附电路原理讲解”,意味着这个电路设计不仅适用于产品研发,还适用于设备维修和理论学习。电路图和讲解将帮助理解电路的工作原理,这对于电子工程师、维修技术人员以及自学电子...
闩锁效应(Latch-up)是 CMOS 工艺所特有的寄生效应,会导致电路的失效,甚至烧毁芯片。闩锁效应是由 NMOS 的有源区、P 衬底、N 阱、PMOS 的有源区构成的 n-p-n-p 结构产生的,当其中一个三极管正偏时,就会构成正...
详细描述数据库锁和事务的内容,其中包括各种类型的锁的讲述,事务的控制
基于单片机protues仿真的多功能密码锁系统设计(仿真图、源代码、讲解视频) 该系统为单片机protues仿真的多功能密码锁系统,实现多功能密码锁设计,并完成上位机和本机的通信功能; 设计要求: 1、可进行密码设置、...
介绍数据库事务的定义和事务带来的问题,详细讲解乐观锁与悲观锁的区别
《电子懒人基础硬件电路图讲解》集合了各种电子技术的基础知识,涵盖了数字、模拟和高频电路等多个领域,为电子初学者提供了一套全面的学习资源。这个压缩包中包含了一系列电路图及其对应的详细讲解,旨在帮助用户...
398、基于单片机protues仿真的多功能电子密码锁系统设计(仿真图、源代码、讲解视频、实物程序、实物连接图) 该系统为单片机protues仿真的多功能电子密码锁系统,实现多功能电子密码锁设计。 设计要求: 1、可进行...
### Python中的线程锁使用详解 在Python编程中,多线程编程是非常常见的技术手段,尤其是在需要处理大量并发任务或实现资源高效利用时。然而,由于Python解释器本身的全局解释器锁(GIL)机制的存在,同一时刻只有...
本资料主要介绍一种基于单片机的简易电子密码锁的设计,它融合了硬件电路与软件编程的精髓,帮助初学者了解并掌握单片机控制技术在实际应用中的运用。 一、单片机基础 单片机,又称微控制器,是一种将CPU、存储器和...
本设计主要是基于STM32F407作为主控芯片,通过搭载一个3.2寸的LCD屏,继电器和一个电磁铁锁头组成了一个基于STM32的电子密码锁。...屏幕校准成功屏幕会显示Adjust ...资料内容:开发文档,视频讲解,源代码,硬件连接图