多线程案例其实也就是一句话,我获得一个线程资源不释放,又要获得另一个资源,
其他线程也是获得一个不释放,又想获得别的线程。其实最多的就是线程之间的相互调用。
/**
* 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
*
* @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系统中,多线程编程是常见的并发执行方式,然而如果不小心,它可能会引发一些问题,特别是死锁。死锁是指两个或多个线程在等待对方释放资源,导致它们都无法继续执行的状态。在这个特定的案例中,我们看到12...
同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的行为。在实际开发中,合理运用线程同步和通信机制,能够提高系统的响应速度和并发处理能力,提升软件的用户体验。
多线程问题及解决方案: 1. 死锁:两个或更多线程相互等待对方释放资源,导致无法继续执行。避免死锁的关键是正确设计资源获取顺序和避免循环等待。 2. 活锁:线程不断尝试获取资源但始终失败,造成无休止的循环。...
要解决这个问题,我们可以使用多线程,将循环执行的任务放在一个单独的线程中,这样不会阻塞用户界面的更新。我们可以创建一个新的线程来执行run方法,该方法包含for循环: ```csharp private void run() { for ...
### Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题 #### 死锁 ##### 1. 说明 在多线程编程中,死锁是一种常见的问题,指的是两个或多个线程在执行过程中,因为竞争资源而造成的一种相互等待...
但是,多线程编程也存在一些安全问题,例如线程同步和死锁问题。 线程同步是指多个线程之间的协作,避免了多个线程之间的竞争和冲突。 Java中可以使用synchronized关键字来取得一个对象的同步锁,从而实现线程同步...
然而,多线程编程也伴随着一系列挑战,如死锁、竞态条件等问题。因此,在实际开发中,开发者需要充分了解多线程的工作原理,并运用适当的工具和技术来保证程序的正确性和稳定性。通过上述介绍的学习资料,新入行的...
在 Netty 框架中,多线程技术的应用可以提高程序的性能和可扩展性,但是同时也需要注意线程安全和死锁问题。 在本文中,我们将介绍四个 Netty 多线程案例,分别是: 1. Netty 3 版本升级遭遇内存泄漏案例 在这个...
在Java编程中,死锁是多线程编程中常见的一个问题,它发生在两个或多个线程因为争夺资源而陷入无法继续执行的状态。死锁的发生通常是因为线程A持有了资源B,而线程B又持有了资源A,导致两者都在等待对方释放资源。...
在Java编程语言中,多线程是并发编程的重要组成...通过这个教学案例,你可以深入了解Java多线程的使用,以及如何在实际场景中运用生产者消费者模式来解决问题。实践这部分知识,将有助于提升你在并发编程领域的技能。
3. **使用TThread类**:最终版本,使用多线程来解决窗口无响应的问题。 ```delphi type TMyThread = class(TThread) protected procedure Execute; override; end; procedure TMyThread.Execute; var i: ...
本示例中的“C#多线程实现简单的任务管理器”是一个很好的学习资源,旨在帮助初学者理解多线程的概念及其在实际应用中的运用。 1. **线程基础**: - **线程与进程**:线程是操作系统分配CPU时间的基本单元,而进程...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。本文将深入探讨Java多线程中...通过阅读和分析提供的`java多线程的案例源代码`,可以更直观地了解这些概念在实际中的应用。
另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多线程编程中需要特别关注的。例如,死锁发生在两个或更多线程互相等待对方释放资源,导致它们都无法继续的情况。避免死锁的方法包括避免循环等待、设置...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。...在深入学习过程中,还需要理解线程安全、同步机制、死锁等问题,以便在实际项目中更加熟练地运用多线程技术。
在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是对Java多线程基础知识的详细解释: 1. **线程的创建方式**: - 继承`Thread`类:自定义一个新的类,...
《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...
- 处理不当的多线程可能导致死锁,即两个或更多线程相互等待对方释放资源,从而无法继续执行。 - 谨慎设置线程优先级,因为高优先级线程过度抢占低优先级线程可能导致性能问题。 7. **线程池** - .NET Framework...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在现代计算机系统中,它能够充分利用多核处理器的计算能力,提高程序的运行效率。本文将深入探讨多线程的经典应用,以及如何在实际开发中有效地使用多线程。...