Java多线程同步死锁例程

      在计算机领域有一个很经典的问题——哲学家进餐问题。在一个桌子旁边,围坐着五个哲学家,每个哲学家左右手边各有一支筷子。要求每个哲学家必须同时拿起两支筷子才可以吃饭。开始吃饭的时候每个哲学家都去拿身边的筷子,这样每个哲学家的手里就只有一支筷子,哲学谁也不想先将筷子放下,都希望别的哲学家先放下筷子。这样每个哲学家都吃不到饭。

         上面的问题同样也会在计算机中线程调度的时候发生。假设在程序中有两个线程1和2。每个线程分别有一个监视器A和B。线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,这样两个线程就都无法运行,就造成了死锁。

package com.javase.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DeadLockDemo {

	public static void main(String[] args) {
		Runnable thread1 = new DeadLockThread(true);
		Runnable thread2 = new DeadLockThread(false);
		ExecutorService es = Executors.newCachedThreadPool();;
		es.execute(thread1);
		es.execute(thread2);
		es.shutdown();
	}

}

class MyThreadLock {
	public static Object lock1 = new Object();
	public static Object lock2 = new Object();
}

class DeadLockThread implements Runnable{
	boolean flag;
	public DeadLockThread(boolean flag){
		this.flag=flag;
	}
	public void run(){
		if(flag){
			synchronized(MyThreadLock.lock1){
				System.out.println("if lock1");
				synchronized(MyThreadLock.lock2){
					System.out.println("if lock2");
				}
			}
		}else{
			synchronized(MyThreadLock.lock2){
				System.out.println("else lock2");
				synchronized(MyThreadLock.lock1){
					System.out.println("else lock1");
				}
			}
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值