----------------------------------要是以后写数据库的产品,不是写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); } } }