1. 程式人生 > >Java之執行緒一(Java多執行緒程式設計核心技術)

Java之執行緒一(Java多執行緒程式設計核心技術)

一、等待/通知機制的實現

1、wait()的作用是使當前執行程式碼的執行緒進行等待,將當前執行緒放入‘預執行佇列’中,並且在wait()所在的程式碼處停止執行,直到接到通知或者中斷為止。注意:在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖,所以只能在同步方法或者同步塊中呼叫wait()方法。——wait方法使執行緒停止執行

2、notify()方法也要放在同步方法或者同步塊中,在呼叫前,也要獲取該物件級別的鎖。該方法用來通知那些可能等待該物件的物件鎖的其他執行緒,如果有多個執行緒,線上程規劃器隨機挑選一個呈wait狀態的執行緒,對其發出通知notify,在執行notify方法後,當前執行緒不會馬上釋放該物件鎖,呈wait狀態的執行緒也並不能馬上獲取該物件鎖,要等到notify方法的執行緒將程式執行完,也就是推出synchronized程式碼塊後,當前執行緒才會釋放鎖,而呈wait狀態的執行緒才可以獲取該物件鎖。——notify使停止的執行緒繼續執行

3、wait和notify如果沒有持有合適的鎖,會丟擲IllegalMonitorStateException

4、notifyAll()方法可以使正在等待佇列中等待同一共享資源的“全部”執行緒從等待狀態退出,進入可執行狀態,按照執行緒優先順序執行。

5、wait(long time) 超時自動喚醒(在這段時間內也可以被其他執行緒喚醒)

6、不能通知過早,應該先執行wait,再執行notify

二、join使用

1、A.join() 使子執行緒A一直執行到結束,讓主執行緒阻塞

2、join與sleep的區別:join內部呼叫了wait方法,釋放了鎖,而sleep卻不釋放鎖

三、ThreadLocal(解決執行緒之間的隔離性)

1、可以將ThreadLoacl類比喻成全域性存放資料的盒子,盒子中可以儲存每個執行緒的私有資料。

四、單例模式

package com.yven.thread;

/**
 * DCL 雙重檢查鎖   執行緒安全 效率高  單例模式
 * @author Administrator
 *
 */
public class Sington {
	
	private static volatile Sington sington;
	
	private Sington(){}
	
	public static Sington getInstance(){
		
		if(sington == null ){
			synchronized(Sington.class){
				if(sington == null){
					sington = new Sington();
				}
			}
		}
		return sington;
	}

}

/**
 * 餓漢模式 執行緒安全
 * @author Administrator
 *
 */
class Sington1{

	private static Sington1 sington = new Sington1();
	
	private Sington1(){}
	
	public static Sington1 getInstance(){
		return sington;
	}
}
/**
 * 懶漢模式,非執行緒安全,需要在getInstance方法中新增synchronized
 * @author Administrator
 *
 */
class Sington2{
private static Sington2 sington  ;
	
	private Sington2(){}
	
	public static Sington2 getInstance(){
		if( sington == null){
			sington = new Sington2();
		}
		return sington;
	}
}

/**
 * 執行緒安全 ,效率低
 * @author Administrator
 *
 */
class Sington3{
private static Sington3 sington  ;
	
	private Sington3(){}
	
	synchronized public static Sington3 getInstance(){
		if( sington == null){
			sington = new Sington3();
		}
		return sington;
	}
}

/**
 * 執行緒不安全
 * @author Administrator
 *
 */
class Sington4{
private static Sington4 sington  ;
	
	private Sington4(){}
	
	public static Sington4 getInstance(){
		if( sington == null){
			
			synchronized(Sington4.class){
				sington = new Sington4();
			}
			
		}
		return sington;
	}
}