日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java容易掉发吗_容易被忽略的面试题—Java高并发

發(fā)布時間:2025/3/15 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java容易掉发吗_容易被忽略的面试题—Java高并发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常見實現(xiàn)如CAS等。

部分樂觀鎖削弱了一致性,但中低并發(fā)程度下的效率大大提高。

并發(fā)編程

Java中如何創(chuàng)建一個線程?

從面相接口的角度上講,實際上只有一種方法實現(xiàn)Runable接口;但Thread類為線程操作提供了更多的支持,所以通常做法是實現(xiàn)Runable接口,實例化并傳入Thread類的構(gòu)造函數(shù)。

繼承Thread,覆寫run方法

實現(xiàn)Runable接口,覆寫run方法

繼承Thread,覆寫run方法

實現(xiàn)Runable接口,覆寫run方法

Vector(HashTable)如何實現(xiàn)線程安全?

通過synchronized關(guān)鍵字修飾每個方法。

依據(jù)synchronized關(guān)鍵字引申出以下問題。

synchronized修飾方法和修飾代碼塊時有何不同?

持有鎖的對象不同:

修飾方法時:this引用的當(dāng)前實例持有鎖

修飾代碼塊時:要指定一個對象,該對象持有鎖

修飾方法時:this引用的當(dāng)前實例持有鎖

修飾代碼塊時:要指定一個對象,該對象持有鎖

從而導(dǎo)致二者的意義不同:

同步代碼塊在鎖定的范圍上可能比同步方法要小,一般來說鎖的范圍大小和性能是成反比的。

修飾代碼塊可以選擇對哪個對象加鎖,但是修飾方法只能給this對象加鎖。

同步代碼塊在鎖定的范圍上可能比同步方法要小,一般來說鎖的范圍大小和性能是成反比的。

修飾代碼塊可以選擇對哪個對象加鎖,但是修飾方法只能給this對象加鎖。

ConcurrentHashMap的如何實現(xiàn)線程安全?

ConcurrentHashMap的線程安全實現(xiàn)與HashTable不同:

可以將ConcurrentHashMap理解為,不直接持有一個HashMao,而是用多個Segment代替了一個HashMap。但實際實現(xiàn)的Map部分和HashMap的原理基本相同,對腳標(biāo)取模來確定table[i]所屬段,從而對不同的段獲取不同的段鎖。

每個Segment持有一個鎖,通過分段加鎖的方式,既實現(xiàn)了線程安全,又兼顧了性能

可以將ConcurrentHashMap理解為,不直接持有一個HashMao,而是用多個Segment代替了一個HashMap。但實際實現(xiàn)的Map部分和HashMap的原理基本相同,對腳標(biāo)取模來確定table[i]所屬段,從而對不同的段獲取不同的段鎖。

每個Segment持有一個鎖,通過分段加鎖的方式,既實現(xiàn)了線程安全,又兼顧了性能

實現(xiàn)并發(fā)線程的方法

要從最簡單的答起,業(yè)界最常用的是重點,有新意就放在最后。

1. synchronized關(guān)鍵字

2. 使用繼承自O(shè)bject類的wait、notify、notifyAll方法

3. 使用線程安全的API和集合類:

使用Vector、HashTable等線程安全的集合類

使用Concurrent包中提供的ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等弱一致性的集合類

在Collections類中有多個靜態(tài)方法,它們可以獲取通過同步方法封裝非同步集合而得到的集合,如List list = Collection.synchronizedList(new ArrayList())。

使用Vector、HashTable等線程安全的集合類

使用Concurrent包中提供的ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等弱一致性的集合類

在Collections類中有多個靜態(tài)方法,它們可以獲取通過同步方法封裝非同步集合而得到的集合,如List list = Collection.synchronizedList(new ArrayList())。

4.使用原子變量、volatile變量等

5. 使用Concurrent包中提供的信號量Semaphore、閉鎖Latch、柵欄Barrier、交換器Exchanger、Callable&Future、阻塞隊列BlockingQueue等.

6. 手動使用Lock實現(xiàn)基于鎖的并發(fā)控制

7. 手動使用Condition或AQS實現(xiàn)基于條件隊列的并發(fā)控制

8. 使用CAS和SPIN等實現(xiàn)非阻塞的并發(fā)控制

使用不變類

9. 其他并發(fā)模型還沒有涉及

從而引申出如下問題:

ConcurrentHashMap的的實現(xiàn)原理

CopyOnWriteArrayList的復(fù)制操作發(fā)生在什么時機

synchronizedList&Vector的區(qū)別

ConcurrentHashMap的的實現(xiàn)原理

CopyOnWriteArrayList的復(fù)制操作發(fā)生在什么時機

synchronizedList&Vector的區(qū)別

synchronizedList的實現(xiàn)中,synchronized關(guān)鍵字修飾代碼塊;Vector的實現(xiàn)中修飾方法。

synchronizedList只封裝了add、get、remove等代碼塊,但I(xiàn)terator卻不是同步的,進(jìn)行遍歷時要手動進(jìn)行同步處理;Vector中對Iterator也進(jìn)行了加鎖。

synchronizedList能夠?qū)⑺蠰ist實現(xiàn)類封裝為同步集合,其內(nèi)部持有的仍然是List的實現(xiàn)類(ArrayList/LinkedList),所以除同步外,幾乎只有該實現(xiàn)類和Vector的區(qū)別。synchronized修飾方法和修飾代碼塊時有何不同

synchronizedList的實現(xiàn)中,synchronized關(guān)鍵字修飾代碼塊;Vector的實現(xiàn)中修飾方法。

synchronizedList只封裝了add、get、remove等代碼塊,但I(xiàn)terator卻不是同步的,進(jìn)行遍歷時要手動進(jìn)行同步處理;Vector中對Iterator也進(jìn)行了加鎖。

synchronizedList能夠?qū)⑺蠰ist實現(xiàn)類封裝為同步集合,其內(nèi)部持有的仍然是List的實現(xiàn)類(ArrayList/LinkedList),所以除同步外,幾乎只有該實現(xiàn)類和Vector的區(qū)別。synchronized修飾方法和修飾代碼塊時有何不同

信號量Semaphore、閉鎖Latch、柵欄Barrier、交換器

Exchanger、Callable&Future、阻塞隊列BlockingQueue的實現(xiàn)原理

ConcurrentLinkedQueue的插入算法

算法核心可概括為兩步:

先檢測是否是中間狀態(tài)(SPIN)

再嘗試CAS插入

先檢測是否是中間狀態(tài)(SPIN)

再嘗試CAS插入

在java中wait和sleep方法的不同?

最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用于線程間交互,sleep通常被用于暫停執(zhí)行。

為什么wait, notify 和 notifyAll這些方法不在thread類里面?

主要原因是JAVA提供的鎖是對象級的而不是線程級的,每個對象都有鎖,通過線程獲得。由于wait,notify和notifyAll都是鎖級別的操作,所以把他們定義在Object類中因為鎖屬于對象。

為什么wait和notify方法要在同步塊中調(diào)用?

Java API強制要求這樣做,如果你不這么做,你的代碼會拋出IllegalMonitorStateException異常。還有一個原因是為了避免wait和notify之間產(chǎn)生競態(tài)條件。

為什么你應(yīng)該在循環(huán)中檢查等待條件?

處于等待狀態(tài)的線程可能會收到錯誤警報和偽喚醒,如果不在循環(huán)中檢查等待條件,程序就會在沒有滿足結(jié)束條件的情況下退出。

Java線程池中submit() 和 execute()方法有什么區(qū)別?

兩個方法都可以向線程池提交任務(wù),execute()方法的返回類型是void,它定義在Executor接口中, 而submit()方法可以返回持有計算結(jié)果的Future對象,它定義在ExecutorService接口中,它擴展了Executor接口,其它線程池類像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有這些方法。

volatile 變量和 atomic 變量有什么不同?

Volatile變量可以確保先行關(guān)系,即寫操作會發(fā)生在后續(xù)的讀操作之前, 但它并不能保證原子性。例如用volatile修飾count變量那么 count++ 操作就不是原子性的。而AtomicInteger類提供的atomic方法可以讓這種操作具有原子性如getAndIncrement()方法會原子性的進(jìn)行增量操作把當(dāng)前值加一,其它數(shù)據(jù)類型和引用變量也可以進(jìn)行相似操作。

為什么Thread類的sleep()和yield ()方法是靜態(tài)的?

Thread類的sleep()和yield()方法將在當(dāng)前正在執(zhí)行的線程上運行。所以在其他處于等待狀態(tài)的線程上調(diào)用這些方法是沒有意義的。這就是為什么這些方法是靜態(tài)的。它們可以在當(dāng)前正在執(zhí)行的線程中工作,并避免程序員錯誤的認(rèn)為可以在其他非運行線程調(diào)用這些方法。

本文整理自 ImportNew

來源:猴子007

(完)

恭喜你今天又獲得了新知識

喜訊 :

總結(jié)

以上是生活随笔為你收集整理的java容易掉发吗_容易被忽略的面试题—Java高并发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。