Java线程同步简介2016-08-18 csdn博客 chy555chy一、方法介绍1、void wait()使得线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步块内部“ (synchronized(object){ ... })被调用。如果当前线程不是锁的持有者,该方法会抛出一个IllegalMonitorStateException异常。即如果锁住的是object,那么你只能调用object的wait()方法。2、void notify()随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步块内部“ (synchronized(object){ ... })被调用。如果当前线程不是锁的持有者,该方法会抛出一个IllegalMonitorStateException异常。3、void notifyAll()解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步块内部“ (synchronized(object){ ... })被调用。如果当前线程不是锁的持有者,该方法会抛出一个IllegalMonitorStateException异常。二、范例讲解( 注意测试类A只能声明为外部类,下面代码在 class A 和 main方法 之间 省略了MainClass { ... } )1、“同步块”测试(1)加synchronized(){}
class A{}public static void main(String[] args) {A object = new A();System.out.println("Main Thread Id = " + Thread.currentThread().getId());synchronized (object) {try {System.out.println("This Thread Id = " + Thread.currentThread().getId());object.wait();} catch (InterruptedException e) {</span>e.printStackTrace();}}}
输出

(2)不加synchronized(){}
class A{}public static void main(String[] args) {A object = new A();System.out.println("Main Thread Id = " + Thread.currentThread().getId());//synchronized (object) {try {</span>System.out.println("This Thread Id = " + Thread.currentThread().getId());</span>object.wait();} catch (InterruptedException e) {</span>e.printStackTrace();}/
URL:http://www.bianceng.cn/Programming/Java/201608/50367.htm