0 0

【Java - 线程】死锁问题0

这段程序为什么会出现死锁

求大神指教


package com.cug.waitAndNotify;


public class MyThread {


public static void main(String[] args) {


Product product = new Product();


Thread t1 = new Thread(new IncreaseThread(product));


Thread t2 = new Thread(new DecreaseThread(product));


Thread t3 = new Thread(new IncreaseThread(product));


Thread t4 = new Thread(new DecreaseThread(product));


t1.start();
t2.start();
t3.start();
t4.start();
}
}


class IncreaseThread implements Runnable {


private Product product;


public IncreaseThread(Product product) {
this.product = product;
}


@Override
public void run() {


for (int i = 0; i < 10; i++) {
product.increase();
}


}
}


class DecreaseThread implements Runnable {


private Product product;


public DecreaseThread(Product product) {
this.product = product;
}


@Override
public void run() {


for (int i = 0; i < 10; i++) {
product.decrease();
}
}
}


class Product {


private int number;


public synchronized void increase() {


while (number != 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(number);
notify();
}


public synchronized void decrease() {


while (number == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(number);
notify();
}


}
2013年12月22日 00:49

2个答案 按时间排序 按投票排序

0 0

楼上说的很对

2013年12月22日 13:04
0 0

因为你在一个条件队列上使用了两个条件谓词。
并且在这种情况下,你只使用了notify来唤醒。那么就有错误唤醒的可能,实际唤醒的那个等待的线程不是你希望的那个,然后实际唤醒的线程在检查条件谓词之后因为没有达到特定的条件而再次等待。最终的结果就是,会有线程始终处于等待状态而不再被唤醒。

这种情况(一个条件队列上使用了多个条件谓词),需要使用notifyAll

2013年12月22日 11:16

相关推荐

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    java模拟线程死锁

    线程死锁是 Java 编程中的一种常见的问题,它可以导致程序的崩溃或性能下降。为了避免线程死锁,我们需要在设计线程之间的交互时,遵循一定的规则和原则,例如避免循环等待、使用锁对象和线程通信机制。

    java多线程死锁预防机制研究

    ### Java多线程死锁预防机制研究 #### 摘要 随着计算机技术的发展和软件系统日益复杂的背景下,多线程编程技术得到了广泛的应用。多线程能够显著提高程序的执行效率,但也随之带来了诸如死锁等问题。死锁是指两个或...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    linux实用脚本show-busy-java-threads

    这个脚本的主要功能是显示正在忙碌的Java线程,帮助我们了解Java应用的运行状况。在多线程环境中,如果某个线程长时间处于忙碌状态,可能会导致性能问题或者阻塞其他线程。通过运行这个脚本,我们可以获取到线程...

    JAVA-线程的入门记录

    ### JAVA-线程的入门记录 #### 多线程概念及基本原理 1. **进程与线程**: - **进程**:是系统进行资源分配和调度的基本单位,是程序的一次动态执行过程。 - **线程**:是进程内的一个执行单元,也是系统调度和...

    show-busy-java-threads.sh文件

    在Java应用程序的运行过程中,有时候会遇到CPU使用率异常升高的情况,这可能是由于线程的不恰当使用或者死锁等问题导致的。`show-busy-java-threads.sh`脚本就是为了帮助开发者快速定位和排查这类性能问题而设计的。...

    北大Java--多线程

    - Java线程有优先级,通过`setPriority()`方法设置。线程调度策略可能依赖于操作系统的具体实现,但通常优先级高的线程会被优先调度。 5. **多线程的互斥与同步**: - 互斥是指在同一时刻,只有一个线程能访问...

    经典Java --线程

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提升程序的效率和响应性。在Java中,线程可以分为两类:用户线程和守护线程。用户线程是应用程序的主要执行部分,而守护线程则是为用户线程...

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    Java多线程-线程安全问题练习题

    线程安全问题通常出现在多线程环境下,当多个线程同时访问和修改共享资源时,可能导致数据不一致、死锁或竞态条件等问题。为解决这些问题,Java提供了多种机制: 1. **同步机制**:包括`synchronized`关键字和`Lock...

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    为了在激烈的Java开发者竞争中脱颖而出,深入理解Java基础知识、JVM(Java虚拟机)、线程并发以及常用框架是至关重要的。这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,...

    JAVA-多线程 所有文件

    4. **线程状态**:Java线程有五种状态:新建、就绪、运行、阻塞和终止。了解这些状态有助于理解线程的生命周期。 5. **同步机制**:Java提供了多种同步机制防止数据竞争,如`synchronized`关键字、`wait()`, `...

    Java多线程编程总结

    Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-...

    java-多线程中的同步与死锁笔记

    java-多线程中的同步与死锁笔记

    Java多线程程序死锁检查 JCarder

    Java多线程编程是开发高并发应用的关键技术之一,但随之而来的是各种复杂的问题,其中最令人头疼的就是死锁。死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。JCarder是Java中用于检测...

    java编程 ---线程

    线程同步是控制多个线程对共享资源的访问,防止数据竞争问题。Java提供了多种同步机制,如`synchronized`关键字、`wait()`/`notify()`、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量等。 理解并熟练运用...

    Java多线程之-死锁.doc

    Java 多线程之死锁 Java 多线程中的死锁是指两个或两个以上的...死锁是 Java 多线程中的一种常见的问题,它可以通过加锁顺序和加锁时限来避免。同时,我们也可以使用一些工具来排查问题,例如 jps 和 jstack 命令。

    Java Swing多线程死锁问题解析

    Java Swing多线程死锁问题解析 Java Swing多线程死锁问题解析是Java开发者经常遇到的问题之一。在基于Java Swing进行图形界面开发时,经常会遇到多线程问题。如果在图形界面的同一个线程中进行查询和运算工作,则会...

    java常见面试题---线程篇

    以下是一些关于Java线程的常见面试知识点,这些内容可能出现在线程.doc文档中: 1. **线程的创建方式**: - 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run()`方法,然后将实例传递给`Thread`类的...

Global site tag (gtag.js) - Google Analytics