1.什么是線程安全?
在《深入理解Java虛擬機(第2版)》中,將線程安全分為了不可變、絕對線程安全、相對線程安全、線程兼容和線程對立五種:
-
不可變
- 不可變的對象一定是線程安全的
- 在Java語言里,如果共享數據是一個基本數據類型,那么只要在定義時使用final關鍵字修飾它就可以保證它是不可變的。 如果共享數據是一個對象,那就需要保證對象的行為不會對其狀態產生任何影響。(被final修飾的字段在構造器中初始化完成前,構造器沒有把“this”的引用傳遞出去,才能保證對象的不可變)
- 保證對象行為不影響自己狀態的途徑有很多種,其中最簡單的就是把對象中帶有狀態的變量都聲明為final,這樣在構造函數結束之后,它就是不可變的
- Java中不可變的類型,包括String、枚舉類型、java.lang.Number的部分子類等等。同為Number的子類型的原子類AtomicInteger和AtomicLong并非是不可變的,而是相對線程安全的。(AtomicInteger的源碼中,value的值是通過volatile關鍵字進行修飾的。volatile可以保證數據的可見性,但卻無法保證有序性)
-
絕對線程安全
- 絕對的線程安全完全滿足Brian Goetz給出的線程安全的定義
- Brian Goetz對線程安全的定義:當多個線程訪問一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲得正確的結果,那這個對象是線程安全的
- 絕對的線程安全完全滿足Brian Goetz給出的線程安全的定義
-
相對線程安全
- 相對的線程安全就是我們通常意義上所講的線程安全,它需要保證對這個對象單獨的操作是線程安全的,我們在調用的時候不需要做額外的保障措施,但是對于一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正確性。
- 在Java語言中,大部分的線程安全類都屬于這種類型,例如Vector、HashTable、Collections的synchronizedCollection()方法包裝的集合等
-
線程兼容
- 線程兼容是指對象本身并不是線程安全的,但是可以通過在調用端正確地使用同步手段來保證對象在并發環境中可以安全地使用,我們平常說一個類不是線程安全的,絕大多數時候指的是這一種情況。
- 如ArrayList和HashMap等
-
線程對立
- 線程對立是指無論調用端是否采取了同步措施,都無法在多線程環境中并發使用的代碼。
2.排序算法有哪些
3.正則表達式是什么?
詳情請見正則表達式30分鐘入門教程