單例模式
定義:(定義都是抽象的,無需過度在意其意義,設(shè)計模式這種東西只可意會不可言傳)確保一個類只有一個實例尊惰,而且自行實例化并向整個系統(tǒng)提供這個實例贾虽。
單例模式寫法有很多種,因地制宜就行,但關(guān)鍵點都是在并發(fā)問題上:
1.private構(gòu)造函數(shù)
2.public static靜態(tài)公有方法
3.保證線程安全秀仲,適應(yīng)多線程并發(fā)訪問:(2個關(guān)鍵點)
? ? ? ? * 同步鎖synchronized修飾符:避免同時被多個線程訪問,防止線程不同步叹誉,保證并發(fā)情況下的原子性骤公,可見性,有序性上陕。
? ? ? ? ? * Volatile修飾符:本質(zhì)是在告訴jvm當(dāng)前變量在寄存器中的值是不確定的,需要從內(nèi)存中讀取(它修飾的變量的讀寫操作都必須在內(nèi)存中進行)桩砰,保證了多線程共享變量的可見性,原子性(需條件)释簿,有序性(需條件))亚隅。
4.保證訪問性能(例如單例每次訪問都進行synchronized判斷影響性能)
5.相關(guān):因為單例涉及并發(fā),涉及synchronized和Volatile修飾符庶溶,這2者都關(guān)系到CUP線程與內(nèi)存交互煮纵,java內(nèi)存模擬。不論是synchronized還是Volatile都是對下面3個保證性問題進行的操作偏螺,只是在某些情況下適用或者不適用行疏。
? ? ? ? 5.1.Java內(nèi)存模擬JMM(JMM定義了java虛擬機JVM在內(nèi)存中的工作方式)
JMM定義了多線程之間共享變量的可見性,一個線程對共享變量的寫入何時對另一個線程可見套像,以及如何在需要的時候?qū)蚕碜兞窟M行同步酿联。
? ? ? ? 5.2.并發(fā)編程必須的3個保證性問題:原子性問題,可見性問題,有序性問題
? ? ? ? ? *原子性:一個操作贞让,要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷周崭,要么就不執(zhí)行。
理解場景:A向B轉(zhuǎn)賬500元操作喳张;2個步驟续镇,賬戶A減去500元,賬戶B加上500元:A減500èB加500销部;過程中如果插入個賬戶B取走500元:A減500èB減500èB加500摸航。原本是2步,變?yōu)?步舅桩。轉(zhuǎn)賬結(jié)果就會發(fā)生錯誤酱虎。
只有簡單的讀取,儲存操作才是原子操作如I= 10(變量之間的互相賦值不是原子操作)江咳,如果要實現(xiàn)更大范圍操作的原子性逢净,可以通過synchronized,因為鎖能保證一個時刻只有一個線程執(zhí)行代碼塊歼指,從而不存在原子性問題爹土。
? ? ? ? *可見性:當(dāng)多個線程訪問同一個變量,一個線程修改了變量的值踩身,他線程能立即看到修改的值胀茵。
理解場景:CPU1下線程1執(zhí)行int I = 0 , I = 10,CPU2下線程2執(zhí)行 j = I ;假若線程1初始化? I = 0 后將 I = 10放入高速緩存中挟阻,但是沒有放入主存中琼娘,此時線程2執(zhí)行,從主存中讀取的仍然是? ? ? I = 0 ,j 就不等于10附鸽。線程1已經(jīng)改變了i的值脱拼,但是線程2沒有立即看到線程1修改的值,導(dǎo)致可見性問題坷备。
Synchronized的鎖能保證同一時間只有一個線程執(zhí)行代碼塊的同時熄浓,在釋放鎖之前會將對變量的修改刷新到主存當(dāng)中,因此避免上面場景中的問題省撑,進而解決可見性問題赌蔑。
? ? ? ? *有序性:程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。
注意場景:指令重排序(InstructionReorder):處理器為了提高程序運行效率竟秫,可能會對輸入的代碼進行優(yōu)化娃惯,不保證各個語句的執(zhí)行先后順序同代碼順序一致,但是保證執(zhí)行結(jié)果一致(單線程一致肥败,多線程233)趾浅。
Synchronized的鎖能保證同一時間只有一個線程執(zhí)行代碼塊愕提,相當(dāng)于單線程執(zhí)行,自然保證有序性潮孽。
Volatile禁止進行指令重排序揪荣。
? ? ? ? ? 5.3.使用volatile必須具備以下2個條件:(2個條件就是保證操作是原子性操作筷黔,從而保證使用volatile關(guān)鍵字的程序在并發(fā)時能夠正確執(zhí)行往史。)
*對變量的寫操作不依賴于當(dāng)前值
*該變量沒有包含在具有其他變量的不變式中
? ? ? ? ? 5.4.synchronized關(guān)鍵字是防止多個線程同時執(zhí)行一段代碼,那么就會很影響程序執(zhí)行效率佛舱,而volatile關(guān)鍵字在某些情況下性能要優(yōu)于synchronized椎例,但是要注意volatile關(guān)鍵字是無法替代synchronized關(guān)鍵字的,因為volatile關(guān)鍵字無法保證操作的原子性请祖。
下周不是線程就是工廠模式订歪。。
對于生活理想肆捕,應(yīng)該像宗教徒對待宗教一樣充滿虔誠與熱情刷晋!