join()
threadB中調(diào)用threadA.join(),表示threadB線程進入等待狀態(tài),讓線程threadA去執(zhí)行,待線程threadA完畢后繼續(xù)執(zhí)行當前線程。
synchronized關鍵字
聲明代碼塊 - synchronized(obj):
當synchronized(obj)中的obj為同一個對象時,代碼塊同步執(zhí)行。如:synchronized(xxx.class)、synchronized("")、同一個對象的synchronized(this);而代碼塊異步執(zhí)行的例子有:不同對象的synchronized(this)。反之異步執(zhí)行。
<b>另外注意:synchronized([同一對象])聲明的代碼段范圍,范圍內(nèi)同步,范圍外異步。</b>聲明方法 - synchronized void method(args){}:
相當于synchronized(this),所以還是要注意是否為同一對象。(注:static方法除外。)
yield()
該方法與sleep()類似,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優(yōu)先級的線程有執(zhí)行的機會。
wait()、notify()、notifyAll()
這三個方法用于協(xié)調(diào)多個線程對共享數(shù)據(jù)的存取,所以必須在synchronized語句塊內(nèi)使用。synchronized關鍵字用于保護共享數(shù)據(jù),阻止其他線程對共享數(shù)據(jù)的存取,但是這樣程序的流程就很不靈活了,如何才能在當前線程還沒退出synchronized數(shù)據(jù)塊時讓其他線程也有機會訪問共享數(shù)據(jù)呢?此時就用這三個方法來靈活控制。
??wait()方法使當前線程暫停執(zhí)行并釋放對象鎖標示,讓其他線程可以進入synchronized數(shù)據(jù)塊,當前線程被放入對象等待池中。
??當調(diào)用notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標志等待池中,只有鎖標志等待池中線程能夠獲取鎖標志;如果鎖標志等待池中沒有線程,則notify()不起作用。
??notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標志等待池中。
ThreadLocal
副本變量,即每個線程獨有的變量。
private static ThreadLocal<T> localVar = new ThreadLocal<>() {
public T initialValue() {
return t;
}
};
localVar.get();
localVar.set(t);
volatile
會使工作內(nèi)存中的變量被修改以后,能夠及時刷新至主內(nèi)存。
- 作用一:標記狀態(tài)
- 作用二:單例模式中的雙重判空(避免出現(xiàn)“指令重排序”的情況)