DeadLock (synchronized)
举例:
两把锁(嵌套),两个线程,相互等待钥匙,但是都等不到。
例如:
public class Deadlock {
public static void main(String[ ] args) {
// These are the two resource objects we'll try to get locks for
final Object resource1 = "resource1";
final Object resource2 = "resource2";
int a=0;
// Here's the first thread. It tries to lock resource1 then resource2
Thread t1 = new Thread( ) {
public void run( ) {
// Lock resource 1
synchronized(resource1) {
System.out.println("Thread 1: locked resource 1");
// Pause for a bit, simulating some file I/O or
// something. Basically, we just want to give the
// other thread a chance to run. Threads and deadlock
// are asynchronous things, but we're trying to force
// deadlock to happen here...
try { Thread.sleep(50); }
catch (InterruptedException e) { }
// Now wait 'till we can get a lock on resource 2
synchronized(resource2) {
while(true){
System.out.println("Thread 1: locked resource 2");
try { Thread.sleep(10000); }
catch (InterruptedException e) { }
}
}
}
}
};
// Here's the second thread. It tries to lock resource2 then resource1
Thread t2 = new Thread( ) {
public void run( ) {
// This thread locks resource 2 right away
synchronized(resource2) {
System.out.println("Thread 2: locked resource 2");
// Then it pauses, just like the first thread.
try { Thread.sleep(50); }
catch (InterruptedException e) { }
// Then it tries to lock resource1. But wait! Thread
// 1 locked resource1, and won't release it 'till it
// gets a lock on resource2. This thread holds the
// lock on resource2, and won't release it 'till it
// gets resource1. We're at an impasse. Neither
// thread can run, and the program freezes up.
synchronized(resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
// Start the two threads. If all goes as planned, deadlock will occur,
// and the program will never exit.
t1.start( );
t2.start( );
}
}
分享到:
相关推荐
下面将详细解释Java中的死锁现象,并通过一个具体的例子来说明。 死锁的四个必要条件: 1. 互斥条件:至少有一个资源是不能同时被两个线程持有的,即一次只有一个线程可以访问。 2. 请求与保持条件:一个线程已经...
在Java编程中,死锁是并发编程中一个重要的概念,它发生在两...总之,理解并避免Java中的死锁对于编写高效、可靠的多线程应用程序至关重要。开发者应具备良好的并发编程知识,以便在设计和实现并发程序时避免这种陷阱。
本文将深入探讨如何使用`synchronized`来解决Java中的死锁问题。 首先,我们需要理解死锁的四个必要条件: 1. 互斥条件:至少有一个资源必须在任何时候只能由一个线程使用。 2. 请求与保持条件:一个线程因请求被...
在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他线程需要的资源,从而导致所有线程...
三、产生死锁的一个例子 下面是一个简单的死锁类的示例代码: public class DeadLock implements Runnable { public int flag = 1; private static Object o1 = new Object(), o2 = new Object(); @Override ...
Java中的线程模型是建立在操作系统级别的线程之上的,因此,通过Java的线程机制,开发者可以充分利用多核处理器的资源,提高程序的并发性和响应速度。下面我们将深入探讨Java中线程的应用实例,以及在实际开发中需要...
在Java中,我们可以使用`synchronized`关键字来模拟互斥条件,以及`wait()`和`notifyAll()`方法来处理进程间的通信。以下是一个简单的死锁示例: ```java public class DeadLockExample { public static void main...
Java模拟死锁发生之演绎哲学家进餐问题案例详解主要介绍了Java中模拟死锁发生之演绎哲学家进餐问题,结合具体演绎哲学家进餐问题的案例形式详细分析了死锁机制与原理。死锁问题是多线程编程中常见的问题之一,发生...
在Java中,可以使用synchronized关键字来控制资源的访问,防止死锁。另外,Java并发库提供了一些工具类,如`java.util.concurrent.locks.ReentrantLock`,它支持可中断和公平锁,有助于避免死锁。例如,使用`...
Java 多线程中的死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于 synchronized 的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死...
本程序通过两个`DeadThread`线程类实例和两个`Test`对象实例演示了死锁(deadlock)现象。死锁是多线程编程中常见的一种问题,发生在多个线程相互等待对方释放资源而无限期阻塞的情况。 在代码中,`DeadThread`继承...
总之,理解并熟练掌握 Java 多线程中的竞态条件、死锁以及同步机制,对于编写线程安全的代码至关重要。通过合理使用 `synchronized`、`wait/notify` 以及 `Lock`,可以有效地管理多线程间的资源竞争,保证程序的正确...
3. **线程的创建**:在Java中,可以通过继承`java.lang.Thread`类或实现`java.lang.Runnable`接口来创建线程。在这个吃包子的例子中,可能会创建厨师线程和顾客线程。 4. **同步机制**:为了防止多个线程对共享资源...
Java 多线程死锁的产生以及如何避免死锁 一、死锁的定义 死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。死锁的产生是由于多个线程在竞争资源时,导致一些...
在Java中,我们可以通过继承Thread类或实现Runnable接口来创建线程。 对于“字符移动”实验,我们可以创建一个线程来处理字符的移动逻辑。例如,定义一个Character类,包含位置信息和移动方法。然后,通过创建...
在Java中,死锁可以通过创建两个或更多线程并让它们各自持有一个对象锁,然后尝试获取对方持有的锁来模拟。这通常涉及`synchronized`关键字,它用于保护临界区,确保同一时间只有一个线程可以访问受保护的代码块。 ...
本文将基于标题、描述、标签以及部分内容,深入剖析Java多线程编程的核心概念,特别聚焦于`synchronized`的使用及其可能引发的死锁问题,并通过实例进行详尽解析。 #### Java多线程基础:从Thread到Runnable Java...
本示例主要探讨了如何通过两种方法来控制Java中的线程数量,以达到优化性能和防止内存不足的目的。 首先,我们来看自定义线程池方法实现线程数控制的例子。线程池(ThreadPool)是Java并发编程中非常重要的概念,它...
在Java中,我们可以使用`synchronized`关键字来实现线程同步。 线程同步在Java中主要有两种实现方式: 1. **同步方法**:通过在方法声明前加上`synchronized`关键字,可以使得整个方法成为同步方法。这意味着每次...