程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java線程同步簡介

Java線程同步簡介

編輯:關於JAVA

一、方法介紹

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved