`
yanguz123
  • 浏览: 568532 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ 死锁的简单例子

    博客分类:
  • Code
 
阅读更多

一个线程类:

import java.util.concurrent.locks.ReentrantLock;


public class DeadLockCar extends Thread {
	private Object obj;
	static ReentrantLock forward = new ReentrantLock();
	static ReentrantLock backword = new ReentrantLock();
	
	public DeadLockCar(Object obj){
		this.obj = obj;
	}
	
	public void run(){
		if(obj==forward){
			try {
				forward.lockInterruptibly();
				Thread.sleep(1000);
				backword.lockInterruptibly();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				if(forward.isHeldByCurrentThread()){
					forward.unlock();
				}
				if(backword.isHeldByCurrentThread()){
					backword.unlock();
				}
			}
			
		}else{
			try {
				backword.lockInterruptibly();
				Thread.sleep(1000);
				forward.lockInterruptibly();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				if(backword.isHeldByCurrentThread()){
					backword.unlock();
				}
				if(forward.isHeldByCurrentThread()){
					forward.unlock();
				}
			}
		}
	}
	
	
	public static void main(String[] args) {
		Thread c1 = new DeadLockCar(DeadLockCar.forward);
		Thread c2 = new DeadLockCar(DeadLockCar.backword);
		c1.start();
		c2.start();
	}
}

 

 

 

两个线程类:

public class DeadLock{
	public static void main(String[] args) {
		Object obj1 = new Object();
		Object obj2 = new Object();
		Thread t1 = new LockA(obj1,obj2);
		Thread t2 = new LockB(obj1,obj2);
		t1.start();
		t2.start();
	}
}

class LockA extends Thread {
	private Object obj1;
	private Object obj2;
	public LockA(Object obj1,Object obj2){
		this.obj1 = obj1;
		this.obj2 = obj2;
	}
	
	public void run(){
		synchronized(obj1){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized(obj2){
				System.out.println("Lock A");
			}
		}
	}
}

class LockB extends Thread {
	private Object obj1;
	private Object obj2;
	public LockB(Object obj1,Object obj2){
		this.obj1 = obj1;
		this.obj2 = obj2;
	}
	
	public void run(){
		synchronized(obj2){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized(obj1){
				System.out.println("Lock B");
			}
		}
	}
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    java 一个死锁的例子

    这个例子中,我们将会深入探讨死锁的产生、识别以及如何避免它。 首先,让我们理解什么是死锁。在多线程环境中,当两个线程A和B分别持有对方需要的资源并等待对方释放时,就会发生死锁。例如,线程A持有资源1并请求...

    线程死锁的例子

    在我们的例子“ConsoleApplication1”中,很可能包含了一个模拟线程死锁的简单控制台应用程序。通过这样的实例,我们可以深入理解线程是如何在操作系统中分配CPU时间片进行工作的。在单处理器系统中,线程不是同时...

    操作系统pv原语解释和例子

    在一个简单的生产者消费者模型中,生产者负责生产数据并放入缓冲区,而消费者则从缓冲区读取数据进行处理。为了确保数据的正确性,需要避免生产者和消费者同时访问缓冲区的情况。 - **信号量定义**: - `S_Buffer`...

    一个简单的和死锁有关的程序

    标题:一个简单的和死锁有关的程序 描述与分析: 本程序通过两个`DeadThread`线程类实例和两个`Test`对象实例演示了死锁(deadlock)现象。死锁是多线程编程中常见的一种问题,发生在多个线程相互等待对方释放资源...

    oracle如何解除死锁

    接下来通过一个简单的例子来说明死锁是如何产生的以及如何解决。 假设有一个表`t2`,其结构如下: | ID | |----| | 1 | | 2 | | 3 | - **Session 1**: ```sql UPDATE t2 SET id = '11' WHERE id = '1'; ``` ...

    vc线程优先级的简单例子例子

    下面是一个简单的示例代码,展示了如何在VC++中创建不同优先级的线程: ```cpp #include #include // 工作线程函数 DWORD WINAPI WorkerThread(LPVOID lpParam) { // 获取线程优先级 int priority = ...

    死锁算法 Java实现 操作系统

    本教程将通过Java实现死锁的模拟,帮助学习者理解这一复杂的概念,并提供一个简单的、易于理解的解决方案。 首先,我们需要了解死锁的四个必要条件: 1. **互斥条件**:资源必须被单个进程独占,即在同一时刻,...

    MySQL REPLACE死锁问题深入剖析1

    MySQL中的REPLACE语句在处理数据时,实际上是一种删除加插入的组合操作,但与简单的DELETE后跟INSERT不同,它涉及到更复杂的锁机制,可能导致死锁。深入理解这些机制对于解决高级MySQL问题至关重要。 首先,我们...

    SQL Server死锁总结

    考虑一个简单的例子,假设有两个任务T1和T2,以及两个资源R1和R2。初始状态下,T1持有R1,T2持有R2。之后,T1请求R2,同时T2请求R1。由于R1和R2都已经被其他任务占用,这将导致T1和T2都陷入无限等待的状态,即发生了...

    OpenGL.rar_OpenGL实现旋转

    它们避免了万向节死锁问题,并且比传统的欧几里得旋转更加平滑。在OpenGL中,可以使用`glRotatef()`函数来应用旋转,该函数接受旋转角度和旋转轴作为参数。 以下是一个简单的示例,展示如何使用OpenGL实现图像旋转...

    进程间通信经典——银行柜员服务问题

    因此,我们需要确保线程的安全执行,防止竞态条件和死锁的发生。 PV原语是荷兰计算机科学家Edsger Dijkstra提出的信号量机制,其中P表示“等待”(Produce),V表示“发布”(Vacate)。在银行柜员服务问题中,我们...

    现代操作系统第章死锁完整版资料.ppt

    其中,银行家算法是一个著名的防止死锁的例子,它通过预先计算和分配资源,确保系统不会进入不安全状态。 **6. 死锁预防** 死锁预防是更严格的策略,旨在消除死锁发生的可能性。这可以通过禁止占有并等待条件、资源...

    内核模块编写例子

    通过这个简单的例子,我们可以学习到内核模块的基本概念和编写方法,为更复杂的内核编程打下基础。在实际应用中,内核模块广泛应用于设备驱动、网络协议、存储系统等领域,为Linux系统提供了强大的可扩展性。

    c++多线程之死锁的发生的情况解析(包含两个归纳,6个示例)

    (2)**单线程重复申请锁**:在`data_process()`和`sub_func()`的例子中,`sub_func()`已经获取了锁,但`data_process()`再次尝试获取相同的锁,这可能导致死锁,因为`LeaveCriticalSection()`不会被调用,除非所有...

    优选操作系统课件第五章死锁与饥饿PPT文档.ppt

    首先,死锁的概念可以通过一个简单的例子来理解:进程P1和P2分别需要资源r1和r2。P1先申请r1,然后r2,最后释放r1和r2;P2则先申请r2,然后r1,最后释放r1和r2。如果两个进程恰好都只获得了它们各自需要的一部分资源...

    Java线程的同步与死锁

    ### Java线程的同步与死锁 #### 一、引言 在Java中,多线程编程是一项重要的技术,能够显著提升程序的性能和响应能力。然而,随着线程数量的增加,线程间的同步问题变得越来越复杂。本文将深入探讨Java线程中的同步...

    计算机操作系统课件:第4章进程同步与通信-死锁03.ppt

    死锁的例子可以从日常生活中的交通死锁或者进程竞争外部设备的情况来类比。例如,两个车辆在交叉路口互相等待对方让路,结果导致双方都无法前进,这就是一个简单的死锁现象。在计算机系统中,当进程A申请输出设备而...

    在BCB中使用多线程 ( 转载 )_BladeW的博客-CSDN博客1

    在这个例子中,Button1Click和Button2Click分别控制线程thread1和thread2的启动与停止。线程的生命周期由TThread类管理,包括创建、执行、暂停、恢复和终止。 然而,多线程编程也需要注意线程安全问题。由于多个...

    资源死锁PPT学习教案.pptx

    举了一个简单的例子,两个进程各自持有对方需要的资源,就像两个人在独木桥的两端,都在等待对方先过桥,形成了一个无法解决的僵局。 接着,提到了死锁产生的原因,主要分为两方面:一是资源的竞争,当多个进程对...

Global site tag (gtag.js) - Google Analytics