死锁与解决死锁

----------------------------------要是以后写数据库的产品,不是写SQL语句,那里面涉及到的锁就跟多了。


故事里有五个哲学家

这些哲学家很穷,只买得起五根筷子。他们坐成一圈,两个人的中间放一根筷子。哲学家吃饭的时候必须同时得到左手边和右手边的筷子。如果他身边的任何一位正在使用筷子,那他只有等着。

假设哲学家的编号是A、B、C、D、E,筷子编号是1、2、3、4、5,红色的是哲学家的手,哲学家和筷子围成一圈如下图所示:

 


实例235  门锁打不开了(死锁)_demo

 实例236 门锁终于被打开了(解决死锁) 

public class DoorOpen {
	static String[] keys = new String[]{"第1把钥匙","第2把钥匙"};
	
	static class DoorKey1 extends Thread{
		public void run(){
			synchronized(keys[0]){
				System.out.println("我拿起了" + keys[0] + ",在等着朋友用" + keys[1] + "开防盗门");  
				try{
					Thread.sleep(100);
				}catch(Exception e){
					System.out.println("线程休眠出错:" + e.getMessage());
				} 
				synchronized(keys[1]){
					System.out.println("我又拿出来"+ keys[1] + "打开了防盗门");
				}
			}
		}
	}
	
	static class DoorKey2 extends Thread { // 静态内部类  
        public void run() {  
          synchronized(keys[0]){
        	System.out.println("\n朋友拿出了" + keys[0] + ",在等待我用"  + keys[1] 
        	         + "开防盗门");
        	try{
        		Thread.sleep(100);
        	}catch (Exception e) { 
        		System.out.println("线程休眠出错:" + e.getMessage());  
        	}
        	synchronized(keys[1]){
        		System.out.println("朋友又拿出了" + keys[1] + "打开了防盗门");  
        	  }
        	}
        }
       }
        
	 static class GoWrong extends Thread { // 静态守护线程类  
		 public GoWrong(){
			 this.setDaemon(true);  // 线程设置守护  
		 }
		 public void run() {  
	            while (true) {  
	                try {  
	                    Thread.sleep(1000); // 线程休眠  
	                } catch (Exception e) { // 捕获异常  
	                    System.out.println("线程休眠出错:" + e.getMessage());  
	                }  
	                System.out.println("守护线程:程序正在运行...");  
	            }  
	        }  
	 }
	 
	 public static void main(String[] args) { // java程序主入口处  
	        DoorKey1 one = new DoorKey1(); // 实例化对象  
	        DoorKey2 two = new DoorKey2();  
	        GoWrong daemon = new GoWrong();  
	        one.start(); // 启动线程  
	        two.start();  
	        daemon.start();  
	    }  

}



实例237  一个死锁的例子

import java.awt.*;
import java.awt.event.*;


public class DeadLock extends Frame{
	protected static final String[] names = {"One", "Two"};
	
	private int  accounts[] = { 1000, 1000 };// 存入账号accounts
	// 创建TextArea组件
	private TextArea info = new TextArea(5,40);


	private TextArea status = new TextArea(5,40);
	
	public DeadLock(){
		super("致命的死锁!");// 调用父类Frame的带参构造方法
		this.setLayout(new GridLayout(2,1));
		add(makePanel(info, "账号"));
		add(makePanel(status, "线程"));
		validate();		//validate验证
		pack();
		show();
		// 创建DeadLockThread对象
		DeadLockThread A = new DeadLockThread(0, this, status);
		DeadLockThread B = new DeadLockThread(1, this, status);
		this.addWindowListener(new WindowAdapter() { // 添加单击事件监听   WindowAdapter 窗口适配器
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}
	
	public synchronized void transfer(int from, int into, int amount) {// 转账transfer
		info.append("\n账户  One:{1}quot; + accounts[0]);// 将给定文本追加到文本区的当前文本
		info.append("\n账户  Two:{1}quot; + accounts[1]);
		info.append("\n>={1}quot; + amount + "从" + names[from]+ "到" + names[into]);
		while (accounts[from]<amount) {
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			accounts[from] = amount;		//账户金额(取]= $金额;
			accounts[into] = amount;		//金额帐户 [到]=金额帐户;
			notify();		//notify(); 通知();
			}
	}
	
	private Panel makePanel(TextArea ta, String title){ // 创建面板,按选择的布局方式将组件进行布局
		Panel p = new Panel();
		p.setLayout(new BorderLayout());
		p.add("North", new Label(title));
		p.add("Center", ta);
		return p;
	}
	
	public static void main(String[] args) {// 本程序的主方法
		DeadLock dl = new DeadLock();
	}
	
}

class DeadLockThread extends Thread {// 死锁线程
	private DeadLock dl;


	private int id;


	private TextArea display;		//TextArea 文字区域
	
	public DeadLockThread(int _id, DeadLock _dl, TextArea _display) {
		dl = _dl;
		id = _id;
		display = _display;
		start();
	}
	
	public void run() {
		while (true) {
			int amount = (int) (2000 * Math.random());
			display.append("\nTread" + DeadLock.names[id] + "将 {1}quot; + amount
					+ "存入" + DeadLock.names[(1 - id)]);
			try {
				sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			dl.transfer(id, 1 - id, amount);
		}
	}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值