1.一個對象是否是安全的岁歉,不在乎這個對象實現(xiàn)了什么功能杨箭,而在于這個對象是否為多個線程使用。(是否說明沒有共享數(shù)據(jù)的類棒呛,就是線程安全的類)也就是說聂示,如果多個線程訪問共享數(shù)據(jù)時,一個個的來簇秒,那線程就是安全的鱼喉。java中關于線程關于同步(一個個來)的做法有:synchronized,volatile趋观,顯示鎖扛禽,原子變量,關于這幾個同步術語后面再談皱坛。
2.面向對象思想為并發(fā)提供了有力的支持编曼。如果設計類的時候考慮到了并發(fā),對類中的共享數(shù)據(jù)(對象中的常量等)進行保護剩辟,對能訪問變量的方法都實現(xiàn)正確的同步掐场。對于共享數(shù)據(jù)的訪問越少越好,一定要訪問的話贩猎,也要加上合適的同步熊户,合適二字就得根據(jù)設計場景來了,比如有時候對數(shù)據(jù)只讀不訪問的方法吭服,還是可以開個后門的嚷堡。(原文:當設計線程安全的類時,良好的面向對象計數(shù)艇棕,不可修改性蝌戒,以及明晰的不變性規(guī)范都能起到一定的幫助作用)
3.說起不可修改性對線程安全的幫助串塑,就得提提String這個東西,String是線程安全的北苟,理由呢桩匪,就是它從出生之后就不改了。String的設計是有不變模式做支持的粹淋,由強不變模式做支持的類吸祟,都是線程安全類。
4.關于線程安全性的定義桃移。原文:線程安全性最核心的定義就是正確性。正確性的含義:某個類的行為與其規(guī)范完全一致葛碧。定義:當多個線程訪問某個類時借杰,這個類始終都能表現(xiàn)出正確的行為,則說這個類是線程安全的进泼。也就是說寫出來的類如果能實現(xiàn)你的業(yè)務蔗衡,并且在多線程的情況下一直不出錯,就說它是線程安全的乳绕。
5.如果在封裝類的時候做了必要的線程同步措施绞惦,則使用它的客戶端無須進一步采取同步措施。
6.原子性:一組語句(操作)作為一個不可分割的單元被執(zhí)行洋措,則說這組語句具有原子性济蝉。
典型的代碼有:a = i++,i++操作是由三個操作組成的讀取i菠发,i的值加1王滤,將i賦值a。如果多個線程同時執(zhí)行這段代碼滓鸠,則會出現(xiàn)同時讀取到i的值雁乡,然后各自加1,先后賦值的情況糜俗,這時i的遞增操作會出現(xiàn)丟失踱稍。
對于上述這種正確結果取決于線程間執(zhí)行順序的情況,有一個正式的名字:競態(tài)條件悠抹。
7.復合操作珠月。存在兩組操作A和B,如果從執(zhí)行A的線程看锌钮,當另一個線程執(zhí)行B時桥温,要么將B全部執(zhí)行完,要么完全不執(zhí)行B梁丘,那么A和B對彼此來說是原子的侵浸。原子操作是指:對于訪問同一個狀態(tài)的所有操作(包括操作本身)旺韭,這個操作是一個以原子方式執(zhí)行的操作。