1.创建两个线程 //卖票 package com.itguigu.exer; class Window extends Thread{ private static int ticket = 100; private static Object o1 = new Object(); public void run() { while (ticket!=0) { synchronized (o1) { if (ticket > 0) { System.out.println(getName()+"窗口号,车票为"+ticket); ticket--; } } } } } public class XianChengLianXi { public static void main(String[] args) { Window w1 = new Window(); Window w2 = new Window(); Window w3 = new Window(); w1.setName("窗口一"); w2.setName("窗口二"); w3.setName("窗口三"); w1.start(); w2.start(); w3.start(); } } 2.简单的死锁 /** * 一个简单的死锁类 * 当SiSuo类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。 package com.itguigu.exer; class Window1 extends Thread{ public int flag =1; private static Object o1 = new Object(),o2=new Object(); public void run(){ if(flag==1){ synchronized (o1){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2){ System.out.println("flag="+flag); } } } if(flag==0){ synchronized (o2){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1){ System.out.println("flag="+flag); } } } } } public class SiSuo { public static void main(String[] args) { Window1 t1 = new Window1(); Window1 t2 = new Window1(); t1.flag=1; t2.flag=0; t1.start(); t2.start(); } }