经常看以前大学里面的教材中的一个解决线程死锁的例子,其技术叫做"资源排序",但代码只是一部分,我今天把它写全,这里的关键点是线程对各个对象加锁顺序一定得保持一致.
/**
* 此类轻易的解决了死锁问题,其核心思想为 各线程按照顺序依次对各对象加锁,
* 假设有三个线程需要竞争三个资源,线程加锁顺序是 lock1,lock2,lock3,这个应该称作为 "资源排序"
*
* @author Chase
*
*/
public class DeadLockSolution {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
private static final Object lock3 = new Object();
private Thread1 thread1 = new Thread1();
private Thread2 thread2 = new Thread2();
private Thread3 thread3 = new Thread3();
class Thread1 extends Thread {
public void run() {
synchronized (lock1) {
System.out.println("线程1已对 1资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock2) {
System.out.println("线程1已对 2资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock3) {
System.out.println("线程1已对 3资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
}
System.out.println("线程1运行完毕!");
}
}
class Thread2 extends Thread {
public void run() {
synchronized (lock1) {
System.out.println("线程2已对 1资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock2) {
System.out.println("线程2已对 2资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock3) {
System.out.println("线程2已对 3资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
}
System.out.println("线程2运行完毕!");
}
}
class Thread3 extends Thread {
public void run() {
synchronized (lock1) {
System.out.println("线程3已对 1资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock2) {
System.out.println("线程3已对 2资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
synchronized (lock3) {
System.out.println("线程3已对 3资源 加锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
}
System.out.println("线程3运行完毕!");
}
}
public DeadLockSolution() {
thread1.start();
thread2.start();
thread3.start();
}
public static void main(String[] args) {
new DeadLockSolution();
}
}
运行结果:
线程1已对 1资源 加锁
线程1已对 2资源 加锁
线程1已对 3资源 加锁
线程1运行完毕!
线程3已对 1资源 加锁
线程3已对 2资源 加锁
线程3已对 3资源 加锁
线程2已对 1资源 加锁
线程3运行完毕!
线程2已对 2资源 加锁
线程2已对 3资源 加锁
线程2运行完毕!
不同的机器线程运行的先后可能不太一样,但是应该不会出现死锁的情况.
分享到:
相关推荐
在Java中,死锁通常与多线程同步有关,尤其是当使用synchronized关键字和wait()、notify()、notifyAll()方法时,如果没有正确管理,就可能导致死锁的发生。 死锁的四个必要条件是: 1. 互斥条件:至少有一个资源是...
在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,导致它们都无法继续执行时,就会出现死锁。`synchronized`关键字是Java提供的一种内置锁机制,用于控制对共享资源的并发访问,...
创建Java线程有两种方式:继承`Thread`类并重写`run()`方法,或者实现`Runnable`接口并提供`run()`方法。当线程对象被创建并调用`start()`方法后,线程进入可运行态,由Java的线程调度器决定何时执行`run()`方法。 ...
- **资源排序**:确保所有线程都按照同一顺序请求资源,可以避免死锁。 6. **工具支持**: 除了`jstack`,还有一些其他的工具和库可以帮助我们管理和防止死锁,例如VisualVM、JProfiler等,它们提供了更直观的...
在Java编程中,多线程是并发执行任务的重要方式,然而随之而来的一个常见问题是线程死锁。死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都无法推进下去。本资料包...
Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。这些状态之间的转换是通过调用特定的方法,如start()、sleep()、join()、wait()、notify()等...
Java死锁问题是一个在多线程编程中常见的复杂情况,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。理解并解决死锁是Java开发者必须掌握的关键技能之一,尤其是在构建高并发、多线程...
在《java线程与并发实践编程》中,作者Jeff Friesen可能还会深入讨论线程池的配置策略、死锁和活锁的预防、线程性能分析与调优,以及Java内存模型(JMM)和线程通信模型(如wait()、notify()、notifyAll())等内容。...
### Java线程教程知识点梳理 #### 一、教程概述 - **目标读者**: 本教程主要面向具备丰富Java基础知识但缺乏多线程编程经验的学习者。 - **学习成果**: 学习者能够掌握编写简单的多线程程序的能力,并能够理解和...
在多线程环境下,死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。避免死锁和活锁的关键在于...
Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...
Java 程序运行慢问题解决方案 ...解决 Java 程序运行慢问题需要从多方面入手,了解 CPU 资源使用情况、Java 进程的每一个线程占用 CPU 的情况、内存泄露、死锁等问题,然后使用相应的解决方法来解决问题。
本文将深入探讨Java中的多线程并发访问解决方案,主要围绕以下几个核心知识点进行阐述: 1. **线程同步机制**: - **synchronized关键字**:Java中的synchronized提供了一种内置锁机制,它可以保证同一时间只有一...
3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...
为了解决多线程间的资源竞争问题,Java提供了多种同步机制: 1. synchronized关键字:可以修饰方法或代码块,保证同一时刻只有一个线程能执行。 2. volatile关键字:保证共享变量的可见性和禁止指令重排序,但不保证...
在Java编程语言中,"门锁"通常是指同步...总之,理解并掌握Java中的门锁机制和死锁解决方案对于编写高效、稳定的多线程程序至关重要。开发者应始终警惕潜在的死锁风险,遵循良好的并发编程实践,以保证程序的正常运行。
避免死锁的关键是避免循环等待,可以通过资源排序、避免嵌套锁等策略来预防。 5. **线程优先级** Java线程具有优先级,`Thread.NORM_PRIORITY`是默认优先级,可以通过`setPriority()`设置优先级。但优先级并不保证...
- **避免死锁**:避免循环等待、设置超时、预排序资源、一次性请求所有资源等策略可以降低死锁的发生概率。 以上就是关于Java线程的一些主要知识点。了解并熟练掌握这些内容,对于编写高效、稳定且并发安全的Java...