多线程死锁的模拟

来源:互联网 发布:c语言标识符和关键字 编辑:程序博客网 时间:2024/05/16 15:08
死锁的原因:
 线程1锁住资源A等待资源B,线程2锁住资源B等待资源A,两个线程
都在等待自己需要的资源,而这些资源被另外的线程锁住,这些线
程你等我,我等你,谁也不愿意让出资源,这样死锁就产生了。
 哲学家进餐问题

 解决死锁的办法之一就是:加大锁的粒度。

package com.qianfeng.TreadTest02;public class DeadLock02 {// 绑匪:说:你给我500亿,我就放了你儿子,目的:得到了500亿// 富翁:说:你先放了我儿子,,我就给你钱,目的:赎回儿子。public static void main(String[] args) {MyThread02 mt1 = new MyThread02();MyThread02 mt2 = new MyThread02();mt1.flag = true;mt2.flag = false;new Thread(mt1).start();new Thread(mt2).start();}}class Kidnapper{public void say(){System.out.println("你给我500亿,我就放了你儿子");}public void get(){System.out.println("得到了500亿");}}class Richman{public void say(){System.out.println("你先放了我儿子,,我就给你钱");}public void get(){System.out.println("赎回儿子");}}class MyThread02 implements Runnable{private static Kidnapper k = new Kidnapper();private static Richman r = new Richman();boolean flag = true;@Overridepublic void run() {if(flag){//kidnappersynchronized (k) {k.say();try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (r) {k.get();}}}else{//richmansynchronized (r) {r.say();try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (k) {r.get();}}}}}

所线程要尽量避免死锁现象的产生

0 0