1.什么是線程安全蔓榄?
在《深入理解Java虛擬機(jī)(第2版)》中系任,將線程安全分為了不可變、絕對(duì)線程安全、相對(duì)線程安全、線程兼容和線程對(duì)立五種:
-
不可變
- 不可變的對(duì)象一定是線程安全的
- 在Java語言里源请,如果共享數(shù)據(jù)是一個(gè)基本數(shù)據(jù)類型,那么只要在定義時(shí)使用final關(guān)鍵字修飾它就可以保證它是不可變的彻况。 如果共享數(shù)據(jù)是一個(gè)對(duì)象谁尸,那就需要保證對(duì)象的行為不會(huì)對(duì)其狀態(tài)產(chǎn)生任何影響。(被final修飾的字段在構(gòu)造器中初始化完成前纽甘,構(gòu)造器沒有把“this”的引用傳遞出去良蛮,才能保證對(duì)象的不可變)
- 保證對(duì)象行為不影響自己狀態(tài)的途徑有很多種,其中最簡(jiǎn)單的就是把對(duì)象中帶有狀態(tài)的變量都聲明為final悍赢,這樣在構(gòu)造函數(shù)結(jié)束之后决瞳,它就是不可變的
- Java中不可變的類型,包括String泽裳、枚舉類型瞒斩、java.lang.Number的部分子類等等破婆。同為Number的子類型的原子類AtomicInteger和AtomicLong并非是不可變的涮总,而是相對(duì)線程安全的。(AtomicInteger的源碼中祷舀,value的值是通過volatile關(guān)鍵字進(jìn)行修飾的瀑梗。volatile可以保證數(shù)據(jù)的可見性,但卻無法保證有序性)
-
絕對(duì)線程安全
- 絕對(duì)的線程安全完全滿足Brian Goetz給出的線程安全的定義
- Brian Goetz對(duì)線程安全的定義:當(dāng)多個(gè)線程訪問一個(gè)對(duì)象時(shí)裳扯,如果不用考慮這些線程在運(yùn)行時(shí)環(huán)境下的調(diào)度和交替執(zhí)行抛丽,也不需要進(jìn)行額外的同步,或者在調(diào)用方進(jìn)行任何其他的協(xié)調(diào)操作饰豺,調(diào)用這個(gè)對(duì)象的行為都可以獲得正確的結(jié)果亿鲜,那這個(gè)對(duì)象是線程安全的
- 絕對(duì)的線程安全完全滿足Brian Goetz給出的線程安全的定義
-
相對(duì)線程安全
- 相對(duì)的線程安全就是我們通常意義上所講的線程安全,它需要保證對(duì)這個(gè)對(duì)象單獨(dú)的操作是線程安全的冤吨,我們?cè)谡{(diào)用的時(shí)候不需要做額外的保障措施蒿柳,但是對(duì)于一些特定順序的連續(xù)調(diào)用,就可能需要在調(diào)用端使用額外的同步手段來保證調(diào)用的正確性漩蟆。
- 在Java語言中垒探,大部分的線程安全類都屬于這種類型,例如Vector怠李、HashTable圾叼、Collections的synchronizedCollection()方法包裝的集合等
-
線程兼容
- 線程兼容是指對(duì)象本身并不是線程安全的蛤克,但是可以通過在調(diào)用端正確地使用同步手段來保證對(duì)象在并發(fā)環(huán)境中可以安全地使用,我們平常說一個(gè)類不是線程安全的夷蚊,絕大多數(shù)時(shí)候指的是這一種情況构挤。
- 如ArrayList和HashMap等
-
線程對(duì)立
- 線程對(duì)立是指無論調(diào)用端是否采取了同步措施,都無法在多線程環(huán)境中并發(fā)使用的代碼撬码。
2.排序算法有哪些
詳情請(qǐng)見十種排序算法及其比較(java實(shí)現(xiàn))
3.正則表達(dá)式是什么儿倒?
詳情請(qǐng)見正則表達(dá)式30分鐘入門教程
4.如何進(jìn)行日期時(shí)間格式化?
詳情請(qǐng)見Java魔法堂:Date與日期時(shí)間格式化