package com.mz.xx.tb;
public class DeadLock implements Runnable {
private String o1 = "lock1";
private String o2 = "lock2";
private String waysName;
public DeadLock(String waysName) {
super();
this.waysName = waysName;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(waysName.equals("way1")){
synchronized(o1){
try {
System.out.println("Lock o1");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (o2) {
System.out.println("way1:Lock o1 o2");
}
}
}
else if(waysName.equals("way2")){
synchronized(o2){
try {
System.out.println("Lock o2");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (o1) {
System.out.println("way2:Lock o2 o1");
}
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new DeadLock("way1"));
Thread t2 = new Thread(new DeadLock("way2"));
t1.start();
t2.start();
}
}
分享到:
相关推荐
本文通过一个简单的化妆类(Markup)和两个对象——口红(LipStick)和镜子(Mirror)的案例,展示了如何在Java中产生死锁。化妆类中的线程尝试同时持有这两个对象的锁,但顺序不同,从而导致了死锁。 首先,我们...
下面是一个简单的死锁案例: 假设我们有两个事务T1和T2,以及两个表`table1`和`table2`,每表有两列`id`(主键)和`value`。 1. T1开始,锁定`table1`中id=1的行。 2. T2开始,锁定`table2`中id=1的行。 3. T1尝试...
在Java编程中,死锁是并发编程中一个重要的概念,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。这个例子中,我们将会深入探讨死锁的产生、识别以及如何避免它。 首先,让我们理解...
本文将深入探讨一个看似不可能发生的死锁案例,并分析其背后的原理。死锁通常发生在多个事务相互等待对方释放资源的情况下,但在这个特定的场景中,我们面对的是一个看似违背常理的情况。 首先,我们来看一下这个...
实验案例提供了一个简单的C语言程序示例,该程序模拟了银行家算法的工作流程。程序首先初始化资源和进程的各种信息,然后通过调用安全性检测算法来判断系统是否处于安全状态。 1. **资源初始化**:程序首先要求用户...
- **用户界面**: 可以采用简单的文本界面或者图形界面(如WPF)来展示哲学家的状态(思考、饥饿、进食)和死锁预防/恢复的情况。 - **核心模块**: - **进程模块**: 创建多个线程模拟哲学家的思考和进食过程。 - **...
Java模拟死锁发生之演绎哲学家进餐问题案例详解 Java模拟死锁发生之演绎哲学家进餐问题案例详解主要介绍了Java中模拟死锁发生之演绎哲学家进餐问题,结合具体演绎哲学家进餐问题的案例形式详细分析了死锁机制与原理...
一个最简单的死锁案例是当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。在线程 A 持有锁 L 并想获得锁 M 的同时,线程 B 持有锁 M 并尝试获得锁 L,那么这两个线程将永远地...
例如,在上述的死锁案例中,当两个session分别对不同的表进行删除操作并形成死锁时,Oracle会选择其中一个事务进行回滚,释放资源,使其他事务可以继续执行。 为了避免死锁,数据库管理员和开发人员应该遵循一些...
通过这些案例,你可以学习如何有效地管理多线程,避免死锁和竞态条件。 案例五:LINQ(Language Integrated Query)。"第3章"可能包含使用LINQ查询数据的例子。LINQ简化了对各种数据源(如数组、集合、数据库)的...
在这个案例中,如果第一个线程先获取了锁 s1 并且正在尝试获取锁 s2 的同时被挂起,而第二个线程则已经获取了锁 s2 并尝试获取锁 s1,那么这两个线程将会陷入死锁状态。 **案例2** 为了更好地模拟死锁,我们可以...
案例可能包含线程同步、死锁、活锁和哲学家就餐问题等经典示例,帮助开发者了解并发编程的复杂性和控制机制。 3. **集合框架**:ArrayList、LinkedList、HashMap、TreeMap等容器的使用,以及它们之间的性能比较和...
此外,也可能涉及死锁和线程安全的数据结构。 4. **TCP/IP通信**:Java的Socket编程可以用于创建网络客户端和服务器。通过实现简单的聊天室或文件传输,可以了解网络编程的基础。 5. **图形用户界面(GUI)**:...
这个“Disruptor专题简单案例资料”很可能包含了一些基础的使用示例和概念解释,帮助我们理解Disruptor的工作原理和优势。 在Java并发编程中,线程之间的通信通常依赖于共享内存,这可能导致竞态条件、死锁等问题,...
8. **案例分析**:教程的每部分都会结合实际案例进行讲解,这些案例可能涵盖简单的命令行工具、图形用户界面应用,甚至可能涉及数据库连接和Web服务。 通过《Java程序设计案例教程》,读者不仅能够掌握Java编程的...
1. 寄回给芯片服务商:这是最简单但最耗时的方法,由专业人员使用专用设备恢复芯片至初始状态。 2. 使用编程器恢复:如果你拥有合适的编程器,可以直接将芯片设置回出厂状态。这通常需要知道正确的熔丝位配置,并且...