package tickets; public class Tickets implements Runnable { static int tickets = 100; Object o = new Object(); boolean isSell = false; boolean ouse;//对象o锁定标志 boolean tuse;//对象this锁定标志 public void run() { // TODO Auto-generated method stub if(!isSell) { while(true) { if(!ouse&&!tuse) { try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } ouse = true; tuse = true; synchronized(o) { synchronized(this) { Thread.yield(); if(tickets>0) { try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"卖出了第"+tickets+"张票"); tickets--; } else { break; } } ouse = false; tuse = false; Thread.yield(); } } } } else { while(true) { if(!ouse&&!tuse) {try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } ouse = true; tuse = true; if(!sell()) { break; } else { Thread.yield(); } } } } } public synchronized boolean sell() { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized(o) { Thread.yield(); if(tickets>0) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"用sell()卖出了第"+tickets+"张票"); tickets--; ouse = false; tuse = false; return true; } else { ouse = false; tuse = false; return false; } } } }
package tickets; public class TicketsTest { public static void main(String[] args) { Tickets t = new Tickets(); new Thread(t,"一号窗口").start(); try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t.isSell = true; new Thread(t,"二号窗口").start(); // new Thread(t,"三号窗口").start(); // new Thread(t,"四号窗口").start(); } }