Java线程:并发协作-死锁
线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。
发生死锁的原因一般是两个对象的锁相互等待造成的。
在《Java线程:线程的同步与锁》一文中,简述死锁的概念与简单例子,但是所给的例子是不完整的,这里给出一个完整的例子。
/**
* Java线程:并发协作-死锁
*
* @author Administrator 2009-11-4 22:06:13
*/
public class Test {
public static void main(String[] args) {
DeadlockRisk dead = new DeadlockRisk();
MyThread t1 = new MyThread(dead, 1, 2);
MyThread t2 = new MyThread(dead, 3, 4);
MyThread t3 = new MyThread(dead, 5, 6);
MyThread t4 = new MyThread(dead, 7, 8);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread extends Thread {
private DeadlockRisk dead;
private int a, b;
MyThread(DeadlockRisk dead, int a, int b) {
this.dead = dead;
this.a = a;
this.b = b;
}
@Override
public void run() {
dead.read();
dead.write(a, b);
}
}
class DeadlockRisk {
private static class Resource {
public int value;
}
private Resource resourceA = new Resource();
private Resource resourceB = new Resource();
public int read() {
synchronized (resourceA) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
synchronized (resourceB) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
return resourceB.value + resourceA.value;
}
}
}
public void write(int a, int b) {
synchronized (resourceB) {
System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
synchronized (resourceA) {
System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
resourceA.value = a;
resourceB.value = b;
}
}
}
}
* Java线程:并发协作-死锁
*
* @author Administrator 2009-11-4 22:06:13
*/
public class Test {
public static void main(String[] args) {
DeadlockRisk dead = new DeadlockRisk();
MyThread t1 = new MyThread(dead, 1, 2);
MyThread t2 = new MyThread(dead, 3, 4);
MyThread t3 = new MyThread(dead, 5, 6);
MyThread t4 = new MyThread(dead, 7, 8);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread extends Thread {
private DeadlockRisk dead;
private int a, b;
MyThread(DeadlockRisk dead, int a, int b) {
this.dead = dead;
this.a = a;
this.b = b;
}
@Override
public void run() {
dead.read();
dead.write(a, b);
}
}
class DeadlockRisk {
private static class Resource {
public int value;
}
private Resource resourceA = new Resource();
private Resource resourceB = new Resource();
public int read() {
synchronized (resourceA) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
synchronized (resourceB) {
System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
return resourceB.value + resourceA.value;
}
}
}
public void write(int a, int b) {
synchronized (resourceB) {
System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
synchronized (resourceA) {
System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
resourceA.value = a;
resourceB.value = b;
}
}
}
}
下面死锁的情况发生了,真是难得一见啊:
相关推荐
Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-...
#### 十一、Java线程:并发协作-死锁 死锁是多线程程序中常见的问题之一,当两个或更多线程相互等待对方持有的资源时会发生死锁。预防死锁的关键在于避免循环等待条件。 #### 十二、Java线程:新特征-线程池 ...
#### 十、Java线程:并发协作-死锁 死锁是指两个或多个线程在执行过程中因竞争资源而造成的一种相互等待的现象。避免死锁的方法包括使用正确的锁顺序、避免循环等待等。 #### 十一、Java线程:volatile关键字 `...
#### 十、Java线程:并发协作-死锁 - **死锁**: - 发生在多个线程互相等待对方持有的锁,从而导致所有线程都无法继续执行的情况。 - 避免死锁的方法包括遵循良好的设计原则,如按序获取锁、使用超时机制等。 ##...
#### 九、Java线程:并发协作-生产者消费者模型 - **生产者消费者模型**:通过共享缓冲区来协调生产者线程和消费者线程的工作。 - **实现方式**:可以使用`BlockingQueue`接口提供的实现类如`ArrayBlockingQueue`等...
在多线程编程中,线程通信是一个至关重要的概念,特别是在并发执行任务时,确保不同线程间的协作和数据同步。本教程将聚焦于利用事件对象进行线程间的通信,这是实现多线程同步的一种常见方法。 事件对象,通常称为...
#### 九、Java线程:并发协作 - **生产者消费者模型** 一种经典的并发模式,其中“生产者”线程负责生产数据,“消费者”线程负责消费数据。这种模型通常通过队列结构来实现。 - **死锁** 死锁发生在多个线程...
通过这10个视频的学习,你将能够掌握Java线程的基本操作,了解线程的创建、执行、协作和管理,为实现高效的并发程序打下坚实的基础。在实际开发中,结合这些知识,你可以编写出更加健壮、性能优异的多线程应用程序。
Java并发编程是Java开发中的重要领域,涉及到多线程、并发控制、同步机制等多个知识点。以下是对Java并发知识体系的详细解析。 首先,我们要理解并发的理论基础。并发是为了提高系统资源利用率和处理能力,让多个...
在Java编程中,线程间的通信是多线程编程中的一个重要概念,特别是在处理并发和协作任务时。生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来...
- **并发协作**:深入探讨了生产者-消费者模型和死锁问题,提供了理解和避免死锁的策略。 - **新特征**:Java 5引入的并发工具,如`ConcurrentHashMap`、`CountDownLatch`、`CyclicBarrier`、`Semaphore`、`...
Java多线程与并发是Java编程中至关重要的一个领域,特别是在构建高性能、高并发的应用时。线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1...
#### Java线程:并发协作-生产者消费者模型与死锁 生产者消费者模型是一种经典的线程间协作模式,用于解决多个线程对有限资源的生产与消费问题。死锁则是多线程程序中常见的问题,发生于多个线程互相等待对方持有的...
以下是一些关于Java线程的常见面试知识点,这些内容可能出现在线程.doc文档中: 1. **线程的创建方式**: - 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run()`方法,然后将实例传递给`Thread`类的...
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
除此之外,Java的并发工具包java.util.concurrent提供了大量方便的类和接口,如ExecutorService用于线程池管理,BlockingQueue用于线程间协作,以及锁机制(如ReentrantLock和读写锁)等。 多线程的优势主要体现在...
在Java编程领域,多线程和高并发是两个至关重要的概念,它们对于构建高效、可扩展的系统至关重要。本文将围绕“Java多线程高并发相关资料收集”这一主题,详细探讨这两个领域的核心知识点。 首先,多线程是指在单个...
这本书深入探讨了Java平台上的多线程编程,是理解和掌握并发编程不可或缺的参考资料。 1. **并发编程基础** - 并发性:并发编程是系统能够同时执行多个任务的能力,是现代多核处理器环境下提高系统效率的关键。 -...
- **避免死锁:** 死锁是指两个或多个线程在等待彼此持有的资源时陷入无限等待的状态。 **实现方式:** - **等待/通知机制:** `wait()`和`notify()`方法可用于实现线程间的等待和唤醒。 - **`join`方法:** 一个...