來源:北大青鳥飛迅校區(qū)|發(fā)布時間:2013-04-22 11:10:12
Java編程保證線程安全的三種方法
1,保證線程安全的三種方法:a,不要跨線程訪問共享變量b,使共享變量是final類型的c,將共享變量的操作加上同步。
2,一開始就將類設計成線程安全的,比在后期重新修復它,更容易。
3,編寫多線程程序,首先保證它是正確的,其次再考慮性能。
4,無狀態(tài)或只讀對象永遠是線程安全的。
5,不要將一個共享變量裸露在多線程環(huán)境下(無同步或不可變性保護)
6,多線程環(huán)境下的延遲加載需要同步的保護,因為延遲加載會造成對象重復實例化
7,對于volatile聲明的數(shù)值類型變量進行運算,往往是不安全的(volatile只能保證可見性,不能保證原子性)。詳見volatile原理與技巧中,臟數(shù)據(jù)問題討論。
8,當一個線程請求獲得它自己占有的鎖時(同一把鎖的嵌套使用),我們稱該鎖為可重入鎖。在jdk1.5并發(fā)包中,提供了可重入鎖的java實現(xiàn)-ReentrantLock。
9,每個共享變量,都應該由一個唯一確定的鎖保護。創(chuàng)建與變量相同數(shù)目的ReentrantLock,使他們負責每個變量的線程安全。
10,雖然縮小同步塊的范圍,可以提升系統(tǒng)性能。但在保證原子性的情況下,不可將原子操作分解成多個synchronized塊。
11,在沒有同步的情況下,編譯器與處理器運行時的指令執(zhí)行順序可能完全出乎意料。原因是,編譯器或處理器為了優(yōu)化自身執(zhí)行效率,而對指令進行了的重排序(reordering)。
12,當一個線程在沒有同步的情況下讀取變量,它可能會得到一個過期值,但是至少它可以看到那個線程在當時設定的一個真實數(shù)值。而不是憑空而來的值。這種安全保證,稱之為最低限的安全性(out-of-thin-air safety)
在開發(fā)并發(fā)應用程序時,有時為了大幅度提高系統(tǒng)的吞吐量與性能,會采用這種無保障的做法。但是針對,數(shù)值的運算,仍舊是被否決的。
13,volatile變量,只能保證可見性,無法保證原子性。
14,某些耗時較長的網(wǎng)絡操作或IO,確保執(zhí)行時,不要占有鎖。
15,發(fā)布(publish)對象,指的是使它能夠被當前范圍之外的代碼所使用。(引用傳遞)對象逸出(escape),指的是一個對象在尚未準備好時將它發(fā)布。
原則:為防止逸出,對象必須要被完全構(gòu)造完后,才可以被發(fā)布(最好的解決方式是采用同步)
this關鍵字引用對象逸出
例子:在構(gòu)造函數(shù)中,開啟線程,并將自身對象this傳入線程,造成引用傳遞。而此時,構(gòu)造函數(shù)尚未執(zhí)行完,就會發(fā)生對象逸出了。
16,必要時,使用ThreadLocal變量確保線程封閉性(封閉線程往往是比較安全的,但一定程度上會造成性能損耗)封閉對象的例子在實際使用過程中,比較常見,例如hibernate openSessionInView機制,jdbc的connection機制。
招生熱線: 4008-0731-86 / 0731-82186801
學校地址: 長沙市天心區(qū)團結(jié)路6號
Copyright © 2006 | 湖南大計信息科技有限公司 版權(quán)所有
湘ICP備14017520號-3