`

多线程死锁问题简单案例

阅读更多
多线程案例其实也就是一句话,我获得一个线程资源不释放,又要获得另一个资源,
其他线程也是获得一个不释放,又想获得别的线程。其实最多的就是线程之间的相互调用。


/**
 * 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
 * 
 * @author Janle
 *
 */
public class 多线程死锁问题 {

	public static void main(String[] args) {
		/*****************************死锁案例1**************************************/
		ThreadDieSock run01 = new ThreadDieSock(1);
		ThreadDieSock run02 = new ThreadDieSock(0);
		Thread thread01 = new Thread(run01);
		Thread thread02 = new Thread(run02);
		 System.out.println("启动线程。。。");
		//thread01.start();thread02.start();
		
		/*****************************死锁案例2**************************************/
		//用main方法作为一个线程
		AA aa=new AA();
		BB bb=new BB();
		Thread t=new Thread (new Runnable() {
			@Override
			public void run() {
				bb.bar(aa);
			}
		});
		t.start();
		aa.foo(bb);
	}
}

/**
 * 线程死锁:死锁案例1
 * 
 * 一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B, 而又想去锁定资源A以完成自身的操作,
 * 两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
 */
class ThreadDieSock implements Runnable {
	private int flag = 1;

	public ThreadDieSock(int flag) {
		this.flag = flag;
	}

	//记住这里一定是要两个共用的资源
	private static Object A = new Object(), B = new Object();

	@Override
	public void run() {
		if (flag == 1) {
			synchronized (A) {
				System.err.println("锁定了一个资源A。休息0.5秒后锁定B去!");
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (B) {
					System.out.println("拥有A的线程锁定B");
				}
			}

		}
		if (flag == 0) {
			synchronized (B) {
				System.err.println("锁定了一个资源B。休息0.5秒后锁定A去!");
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (A) {
					System.out.println("拥有B的线程锁定A");
				}
			}

		}
	}
}

/*****************************线程之间的方法相互的调用:死锁案例2**************************************/
class AA {
    public synchronized void foo(BB b) {
        System.out.println(Thread.currentThread().getName() + " 进入AA的foo");
        try {
            Thread.sleep(200);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 试图调用BB的last");
        b.last();
    }
    public synchronized void last() {
        System.out.println("AA的last()");
    }
}
 
class BB{
    public synchronized void bar(AA a) {
        System.out.println(Thread.currentThread().getName() + " 进入BB的bar方法");
        try {
            Thread.sleep(200);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 试图调用AA的last方法");
        a.last();
    }
    //在使用bb对象调用last时候已经有对象的锁了
    public synchronized void last() {
        System.out.println("BB的last()");
    }
}


分享到:
评论

相关推荐

    linux多线程死锁问题分析

    在Linux系统中,多线程编程是常见的并发执行方式,然而如果不小心,它可能会引发一些问题,特别是死锁。死锁是指两个或多个线程在等待对方释放资源,导致它们都无法继续执行的状态。在这个特定的案例中,我们看到12...

    java多线程经典案例

    同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的行为。在实际开发中,合理运用线程同步和通信机制,能够提高系统的响应速度和并发处理能力,提升软件的用户体验。

    多线程案例,多线程教程

    多线程问题及解决方案: 1. 死锁:两个或更多线程相互等待对方释放资源,导致无法继续执行。避免死锁的关键是正确设计资源获取顺序和避免循环等待。 2. 活锁:线程不断尝试获取资源但始终失败,造成无休止的循环。...

    多线程案例

    要解决这个问题,我们可以使用多线程,将循环执行的任务放在一个单独的线程中,这样不会阻塞用户界面的更新。我们可以创建一个新的线程来执行run方法,该方法包含for循环: ```csharp private void run() { for ...

    Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

    ### Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题 #### 死锁 ##### 1. 说明 在多线程编程中,死锁是一种常见的问题,指的是两个或多个线程在执行过程中,因为竞争资源而造成的一种相互等待...

    详细剖析JAVA多线程案例教学

    然而,多线程编程也伴随着一系列挑战,如死锁、竞态条件等问题。因此,在实际开发中,开发者需要充分了解多线程的工作原理,并运用适当的工具和技术来保证程序的正确性和稳定性。通过上述介绍的学习资料,新入行的...

    Netty多线程案例集锦

    在 Netty 框架中,多线程技术的应用可以提高程序的性能和可扩展性,但是同时也需要注意线程安全和死锁问题。 在本文中,我们将介绍四个 Netty 多线程案例,分别是: 1. Netty 3 版本升级遭遇内存泄漏案例 在这个...

    死锁_Java产生死锁的简单案例

    在Java编程中,死锁是多线程编程中常见的一个问题,它发生在两个或多个线程因为争夺资源而陷入无法继续执行的状态。死锁的发生通常是因为线程A持有了资源B,而线程B又持有了资源A,导致两者都在等待对方释放资源。...

    详细描述了Delphi多线程编程,超级简单易懂

    3. **使用TThread类**:最终版本,使用多线程来解决窗口无响应的问题。 ```delphi type TMyThread = class(TThread) protected procedure Execute; override; end; procedure TMyThread.Execute; var i: ...

    java多线程处理教学案例

    在Java编程语言中,多线程是并发编程的重要组成...通过这个教学案例,你可以深入了解Java多线程的使用,以及如何在实际场景中运用生产者消费者模式来解决问题。实践这部分知识,将有助于提升你在并发编程领域的技能。

    C#多线程实现简单的任务管理器

    本示例中的“C#多线程实现简单的任务管理器”是一个很好的学习资源,旨在帮助初学者理解多线程的概念及其在实际应用中的运用。 1. **线程基础**: - **线程与进程**:线程是操作系统分配CPU时间的基本单元,而进程...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。本文将深入探讨Java多线程中...通过阅读和分析提供的`java多线程的案例源代码`,可以更直观地了解这些概念在实际中的应用。

    java 多线程并发实例

    另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多线程编程中需要特别关注的。例如,死锁发生在两个或更多线程互相等待对方释放资源,导致它们都无法继续的情况。避免死锁的方法包括避免循环等待、设置...

    java多线程设置线程休眠案例

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。...在深入学习过程中,还需要理解线程安全、同步机制、死锁等问题,以便在实际项目中更加熟练地运用多线程技术。

    java多线程案例——未完成

    在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是对Java多线程基础知识的详细解释: 1. **线程的创建方式**: - 继承`Thread`类:自定义一个新的类,...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    c# WPF 多线程简单实例

    - 处理不当的多线程可能导致死锁,即两个或更多线程相互等待对方释放资源,从而无法继续执行。 - 谨慎设置线程优先级,因为高优先级线程过度抢占低优先级线程可能导致性能问题。 7. **线程池** - .NET Framework...

    多线程经典例子

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在现代计算机系统中,它能够充分利用多核处理器的计算能力,提高程序的运行效率。本文将深入探讨多线程的经典应用,以及如何在实际开发中有效地使用多线程。...

    汪文君JAVA多线程编程实战(完整不加密)

    这些案例涵盖了从简单的并发任务到复杂的多线程设计模式,如生产者消费者模型、线程池的使用以及线程间的通信技巧。通过这些实战练习,读者能够更好地理解多线程编程中的挑战和解决方案。 本书还涉及到了Java并发...

Global site tag (gtag.js) - Google Analytics