1 package com.cn; 2 3 class Test{ 4 public static void main(String [] args){ 5 TestThread t = new TestThread(); 6 new Thread(t).start(); 7 try { 8 Thread.sleep(10); 9 } catch (InterruptedException e) {10 e.printStackTrace();11 }12 t.str="method";13 new Thread(t).start();14 }15 }16 17 class TestThread implements Runnable {18 int tickets = 100;19 String str = new String("");20 public void run() {21 if(str.equals("method")){22 while(true){23 synchronized (this) {24 if(tickets>0){25 try {26 Thread.sleep(10);27 } catch (InterruptedException e) {28 e.printStackTrace();29 }30 System.out.println(Thread.currentThread().getName()+" is salling ticket "+tickets--);31 }32 }33 }34 }else{35 while(true){36 sale();37 }38 }39 }40 public synchronized void sale(){41 if(tickets>0){42 try {43 Thread.sleep(10);44 } catch (InterruptedException e) {45 e.printStackTrace();46 }47 System.out.println(Thread.currentThread().getName()+" is salling ticket "+tickets--);48 }49 }50 }
sale()方法使用的监视器对象是this,所以要实现同步代码块和sale()方法之间的同步,同步代码块检查的同步对象也应该为this