目錄:
1.并行和并發(fā):
2.進(jìn)程和線(xiàn)程:
3.創(chuàng)建多線(xiàn)程的方式:
4.接口和繼承多線(xiàn)程的區(qū)別:
5.callable和runnable的區(qū)別:
6.線(xiàn)程的生命周期:
7.線(xiàn)程死亡狀態(tài):
8.線(xiàn)程安全問(wèn)題:
9.解決線(xiàn)程安全問(wèn)題方法:
10.同步代碼塊和同步方法和同步鎖:
11.公平鎖和非公平鎖:
12.synchronized和lock的區(qū)別:
13.死鎖:
14.死鎖的4個(gè)條件:
15.死鎖預(yù)防:
16.線(xiàn)程間通訊:
17.Threadlocal:
18.可重入鎖和不可重入鎖:
19.同步容器和并發(fā)容器:
20.多線(xiàn)程的優(yōu)點(diǎn)和缺點(diǎn):
21.線(xiàn)程池的優(yōu)點(diǎn):
22.線(xiàn)程池核心參數(shù):
23.并發(fā)編程常見(jiàn)的三個(gè)問(wèn)題:
24.java內(nèi)存模型:
25.synchronized的特性:
1.并行和并發(fā):
并行:多個(gè)線(xiàn)程在同一時(shí)間點(diǎn)發(fā)生。
并發(fā):多個(gè)線(xiàn)程在同一個(gè)時(shí)間段發(fā)生。
2.進(jìn)程和線(xiàn)程:
進(jìn)程:應(yīng)用程序的運(yùn)行。
線(xiàn)程:進(jìn)程的單位。
3.創(chuàng)建多線(xiàn)程的方式:
1.繼承thread類(lèi)。
2.實(shí)現(xiàn)runnable接口。
3.實(shí)現(xiàn)callable接口。
4.使用線(xiàn)程池。
4.接口和繼承多線(xiàn)程的區(qū)別:
1.接口避免了java單繼承帶來(lái)的局限性。
2.線(xiàn)程池只支持接口的方式。
5.callable和runnable的區(qū)別:
相同點(diǎn):callable和runnable都是使用接口創(chuàng)建多線(xiàn)程。
不同點(diǎn):callable需要重寫(xiě)call方法,runnable需要重寫(xiě)run方法。
? ? ? ? ? ? ? ? callable需要處理異常,runnable不需要處理異常。
? ? ? ? ? ? ? ? callable有返回值,runnable沒(méi)有返回值。
? ? ? ? ? ? ? ? callable可以中斷,runnable不能中斷。
6.線(xiàn)程的生命周期:
1.新建狀態(tài):new出來(lái)的時(shí)候。
2.就緒狀態(tài):調(diào)用start方法。
3.運(yùn)行狀態(tài):cpu調(diào)度。
4.阻塞狀態(tài):調(diào)用wait,sleep,或join方法,同步阻塞,獲取其他線(xiàn)程鎖定的對(duì)象。
5.死亡狀態(tài):線(xiàn)程運(yùn)行結(jié)束等情況。
7.線(xiàn)程死亡狀態(tài):
1.run方法結(jié)束。
2.線(xiàn)程出現(xiàn)異常。
3.調(diào)用stop方法。
8.線(xiàn)程安全問(wèn)題:
多線(xiàn)程安全主要由全局變量或靜態(tài)變量引起。一旦操作全局變量或靜態(tài)變量,則可能引發(fā)線(xiàn)程的安全性問(wèn)題。
9.解決線(xiàn)程安全問(wèn)題方法:
1.synchronized關(guān)鍵字
2.同步鎖lock
3.volatile關(guān)鍵字修飾全局變量或靜態(tài)變量。
4.局部變量threadlocal
10.同步代碼塊和同步方法和同步鎖:
同步代碼塊:synchronized修飾一段代碼塊,需要鎖定一個(gè)對(duì)象。
同步方法:synchronized修飾方法,鎖定的對(duì)象為類(lèi)本身。
同步鎖:new一個(gè)lock對(duì)象,在需要同步的代碼中先加鎖,再使用try catch包住同步的內(nèi)容,最后再finally中解鎖。
11.公平鎖和非公平鎖:
公平鎖:按線(xiàn)程的先來(lái)后到的順序依次獲取鎖。
非公平鎖:多個(gè)線(xiàn)程可以同時(shí)搶占鎖。
12.synchronized和lock的區(qū)別:
synchronized是一個(gè)關(guān)鍵字,可以修飾代碼塊和方法,發(fā)生異常會(huì)自動(dòng)釋放鎖,不可中斷。
lock是一個(gè)接口,發(fā)生異常不會(huì)釋放鎖,所以需要再finally中手動(dòng)釋放鎖,可以中途中斷。
13.死鎖:
多個(gè)線(xiàn)程因?yàn)闋?zhēng)奪資源,而造成的一種相互等待的現(xiàn)象,無(wú)外力作用下,無(wú)法繼續(xù)推動(dòng)。此時(shí)不會(huì)發(fā)生異常,而是所有的線(xiàn)程都處于阻塞的狀態(tài)。
14.死鎖的4個(gè)條件:
1.互斥條件:當(dāng)一個(gè)線(xiàn)程獲取鎖后,不允許其他線(xiàn)程鎖定。
2.不可剝奪條件:鎖定的對(duì)象,無(wú)法被強(qiáng)制剝奪。
3.請(qǐng)求保持:線(xiàn)程獲取鎖后,除非運(yùn)行完畢,否則不會(huì)釋放鎖。
4.循環(huán)等待:多個(gè)線(xiàn)程鎖定對(duì)象后,等待其他線(xiàn)程獲取的資源釋放。
15.死鎖預(yù)防:
1.避免多次鎖定,即鎖定一個(gè)對(duì)象后,再鎖定第二對(duì)象,釋放之前鎖定的對(duì)象。
2.設(shè)定鎖的超時(shí)時(shí)間。
3.使多個(gè)線(xiàn)程有相同的加鎖順序。
16.線(xiàn)程間通訊:
正常來(lái)說(shuō)多線(xiàn)程是由cpu隨機(jī)調(diào)配執(zhí)行,當(dāng)我們想讓多線(xiàn)程按照我們預(yù)想的方式執(zhí)行,則需要使用線(xiàn)程間通訊。
1.休眠喚醒:調(diào)用wait方法后,線(xiàn)程休眠,但必須使用notify來(lái)喚醒。
Object:wait、notify、notifyall
Condition: condition、signal、signalall
2.countdownlatch:使一個(gè)線(xiàn)程等待其他線(xiàn)程執(zhí)行完畢后,再執(zhí)行。
3.cyclicbarrier:一組線(xiàn)程等待某個(gè)狀態(tài)后,一起執(zhí)行。
17.Threadlocal:
threadlocal提供了線(xiàn)程的局部變量。即相同的變量由每一個(gè)線(xiàn)程單獨(dú)維護(hù)。和synchronized相似避免了多個(gè)線(xiàn)程訪問(wèn)相同的變量是,造成的訪問(wèn)沖突。
synchronized犧牲了時(shí)間來(lái)保證變量訪問(wèn)的沖突。
threadlocal因?yàn)槊恳粋€(gè)線(xiàn)程都有單獨(dú)的局部變量,所以犧牲了空間來(lái)保證變量訪問(wèn)的沖突。
使用方法:new一個(gè)threadlocal對(duì)象后,調(diào)用get和set方法即可。
18.可重入鎖和不可重入鎖:
可重入鎖:線(xiàn)程可以拿到自己鎖定的對(duì)象,但解鎖的時(shí)候,鎖定幾次就需要解鎖幾次。
不可重入鎖:線(xiàn)程不能拿到自己鎖定的對(duì)象,會(huì)發(fā)生阻塞。
19.同步容器和并發(fā)容器:
同步容器:victor,hashtable.
并發(fā)容器:currenthashmap
20.多線(xiàn)程的優(yōu)點(diǎn)和缺點(diǎn):
多線(xiàn)程優(yōu)點(diǎn):提高資源利用率,提升程序的執(zhí)行效率。
多線(xiàn)程缺點(diǎn):創(chuàng)建和銷(xiāo)毀線(xiàn)程浪費(fèi)資源,線(xiàn)程間的切換同樣浪費(fèi)資源。
21.線(xiàn)程池的優(yōu)點(diǎn):
1.減少了線(xiàn)程的創(chuàng)建和銷(xiāo)毀,節(jié)約資源。
2.避免高訪問(wèn)量是,創(chuàng)建大量的線(xiàn)程,造成資源不足。
22.線(xiàn)程池核心參數(shù):
核心線(xiàn)程數(shù):線(xiàn)程池創(chuàng)建時(shí)創(chuàng)建的線(xiàn)程數(shù),這些線(xiàn)程不會(huì)被銷(xiāo)毀。
最大線(xiàn)程數(shù):線(xiàn)程池所能創(chuàng)建的最大線(xiàn)程數(shù)。
阻塞隊(duì)列:核心線(xiàn)程滿(mǎn)后,多余的請(qǐng)求放在阻塞隊(duì)列中。
空閑線(xiàn)程存活時(shí)間:核心線(xiàn)程和阻塞隊(duì)列滿(mǎn)后,額外創(chuàng)建的線(xiàn)程存活的時(shí)間。
handle:當(dāng)最大線(xiàn)程數(shù)也滿(mǎn)了的時(shí)候,所采取的策略。(1.直接拋異常,2.誰(shuí)提交誰(shuí)執(zhí)行,3.拋棄隊(duì)列中等待的任務(wù),4.拋棄當(dāng)前任務(wù))
23.常用的4個(gè)線(xiàn)程池:
1.newCachedThreadPool:核心線(xiàn)程數(shù)為0。有新任務(wù)時(shí),會(huì)自動(dòng)創(chuàng)建線(xiàn)程。
2.newFixedThreadPool :核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)相同,即最多創(chuàng)建的線(xiàn)程數(shù)就是核心線(xiàn)程數(shù)。多余的線(xiàn)程交給隊(duì)列。
3.newSingleThreadExecutor :線(xiàn)程數(shù)量始終只有一個(gè),保證了隊(duì)列的先進(jìn)先出。
4.newScheduledThreadPool:支持定時(shí)或周期性的任務(wù)。
23.并發(fā)編程常見(jiàn)的三個(gè)問(wèn)題:
1.可見(jiàn)性:
當(dāng)一個(gè)線(xiàn)程對(duì)共享變量的值進(jìn)行修改后,其他的線(xiàn)程無(wú)法立即查看更新的值。
2.原子性:
當(dāng)一個(gè)線(xiàn)程對(duì)共享變量操作到一半時(shí),另外的線(xiàn)程也可能操作該變量,干擾了前一個(gè)線(xiàn)程的執(zhí)行,例如i++;
3.有序性:
程序中代碼的執(zhí)行順序,并不一定是按照開(kāi)發(fā)者編寫(xiě)的代碼的順序。
java常用synchronized關(guān)鍵字來(lái)保證這三大特性。
24.java內(nèi)存模型:
java內(nèi)存模型是一套規(guī)范,描述了共享變量的訪問(wèn)規(guī)則,java內(nèi)存模型是對(duì)共享數(shù)據(jù)的可見(jiàn)性,原子性,有序性的規(guī)則和保障。
25.synchronized的特性:
1.可重入特性:一個(gè)線(xiàn)程可以重復(fù)進(jìn)入synchronized,重復(fù)獲取同一把鎖。原理是內(nèi)部有一個(gè)計(jì)數(shù)器會(huì)記錄獲取幾次數(shù)。
2.不可中斷特性:一個(gè)線(xiàn)程獲取鎖后,另一個(gè)線(xiàn)程想要獲取鎖,必須等待,如果第一個(gè)線(xiàn)程不釋放鎖,第二個(gè)線(xiàn)程會(huì)一直等待。
26.CAS:
CAS:compare and Swap,比較相同再交換。CAS可以保證共享變量賦值時(shí)的原子操作。當(dāng)多個(gè)線(xiàn)程cas更新同一個(gè)變量時(shí),只有一個(gè)能成功,其他的全部失敗,失敗的線(xiàn)程可以再次嘗試更新。CAS屬于樂(lè)觀鎖,即每次拿數(shù)據(jù)都認(rèn)為不會(huì)修改,有人修改了就重試。
舊值和內(nèi)存中的值和新值:比較內(nèi)存中的值和舊值是否相同,相同則替換成新值。
ABA問(wèn)題:線(xiàn)程一從內(nèi)存中取出變量A,線(xiàn)程二同樣從內(nèi)存中取出A,并將A的值替換成B之后,又重新賦值為A,此時(shí)線(xiàn)程一再?gòu)膬?nèi)存中拿到變量A,發(fā)現(xiàn)沒(méi)變化,誤認(rèn)為還是原來(lái)的A,操作成功。例如別人挪用資金后,趁你沒(méi)發(fā)現(xiàn)又還了回來(lái),表面上沒(méi)影響,實(shí)際可能出現(xiàn)大問(wèn)題。解決方式是使用AtomicStampedReference類(lèi)來(lái)解決,具體就是加版本號(hào),每操作一次就加上版本號(hào)。