java模拟线程死锁

 1 public class Main{
 2
 3     /*模拟死锁
 4      *
 5      * PersonA要拿到B才把A给B
 6      * PersonB要拿到A才把B给A
 7      *
 8      *
 9      *
10      */
11
12     public static void main(String[] args) {
13         new Thread(new Run(true)).start();
14         new Thread(new Run(false)).start();
15     }
16
17 }
18
19 class PersonA{
20
21     public void say(){
22         System.out.println("A说:把B给我");
23     }
24
25     public void getB(){
26         System.out.println("A得到了B的东西");
27     }
28 }
29
30 class PersonB{
31     public void say(){
32         System.out.println("B说:把A给我");
33     }
34
35     public void getA(){
36         System.out.println("B得到了A的东西");
37     }
38 }
39
40 class Run implements Runnable{
41
42     //一定要是静态的对象
43     static PersonA a = new PersonA();
44     static PersonB b = new PersonB();
45     private boolean aGiveB;        //是否是A给B
46
47     public Run(boolean aGiveB){
48         this.aGiveB = aGiveB;
49     }
50
51     @Override
52     public void run() {
53         if(aGiveB){
54             synchronized (b) {
55                 b.say();
56                 try {
57                     Thread.sleep(500);
58                 } catch (InterruptedException e) {
59                     e.printStackTrace();
60                 }
61                 synchronized (a) {
62                     System.out.println("a把A给了b");
63                     b.getA();
64                 }
65             }
66         }else{
67             synchronized (a) {
68                 a.say();
69                 try {
70                     Thread.sleep(500);
71                 } catch (InterruptedException e) {
72                     e.printStackTrace();
73                 }
74                 synchronized (b) {
75                     System.out.println("b把B给了a");
76                     a.getB();
77                 }
78             }
79         }
80     }
81
82 }
时间: 2024-10-25 05:21:08

java模拟线程死锁的相关文章

模拟线程死锁

package test.access.foreign; public class Foreign { public static void main(String args[]){ MyThread mt1=new MyThread(); mt1.flag=false; new Thread(mt1).start(); MyThread mt=new MyThread(); new Thread(mt).start(); } /** * 打印结果: */ } class Personnel{

Java笔记六.线程同步、线程死锁

线程同步.线程死锁 在上一篇文章中,有一个模拟售卖火车票系统,在卖车票的程序代码中,极有可能碰到一种意外,就是同一张票号被打印两次多次,也可能出现打印出0甚至负数的票号.具体表现为:假设tickets的值为1的时候,线程1刚执行完if(tickets>0)这行代码,正准备执行下面的代码,就在这时,操作系统将CPU切换到了线程2上执行,此时tickets的值仍为1,线程2执行完上面两行代码,tickets的值变为0后,CPU又切回到了线程1上执行,线程1不会再执行if(tickets>0)这行代

I学霸官方免费教程四十一 :Java基础教程之线程死锁

线程死锁 是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程. 例如:某一商店有两个人PS和PB在做交易,PS手里拿着货物对PB说,你先给我钱我在给你货,而PB拿着钱对PS说你先给我货我在给你钱.两个人就此僵持下去,永远也无法做成交易,这就构成了死锁. 实例: package thread.deadlock; /** * 创建DeadlockDe

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

JAVA笔记14__多线程共享数据(同步)/ 线程死锁 /

/** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两种方法: * 1.同步代码块 * synchronized(要同步的对象){ 要同步的操作 } * 2.同步方法 * public synchronized void method(){ 要同步的操作 } */ public class Main { public static void main(

Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.

Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript. 1. 现象::主程序卡住无反应,多行任务不往下执行 1 2. 原因::使用jv jprofile查看线程,原来俩个线程死锁了.. 1 3. Java的缺点,默认不能自动解除死锁 1 4. 自动检测与解除死锁::使用看门狗watchdog 2 4.1. 死锁检测算法(太麻烦,不推荐) 2 4.2. 硬件看门狗 2 4.3. 软件看门狗的实现--TIMER 2 4.4. LIN

Java线程 - 死锁(deadlock)

一.死锁 死锁是指这样一种状况.当多个线程竞争稀缺资源的时,由于他们相互等待获取对方线程所拥有的资源,大家都无法满足,从而都无法继续执行的情形. P2进程拥有R1资源,但他正请求获取R2资源:而P1进程拥有R2资源,但他正请求R1资源. 1.1 Coffman条件--产生死锁的4个条件 如果一个系统中如下4种情形同时存在,则产生死锁情形的机会就会上升 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用 等待和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持

java多线程之 ---- 线程死锁

java多线程之线程死锁 产生死锁的主要原因: 因为系统资源不足. 进程运行推进的顺序不合适. 资源分配不当等. 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁.其次, 进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件:  互斥条件:一个资源每次只能被一个进程使用. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. 循环等待条件:若干进

Java线程死锁解决方法(转)

转自:http://leowzy.iteye.com/blog/740859 Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成.假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭.他们都需要获得两个锁:共享