91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

43道多線程面試題,附帶答案(三)

發布時間:2020-08-15 06:07:55 來源:網絡 閱讀:319 作者:Java筆記丶 欄目:編程語言

1.volatile關鍵字在Java中有什么作用?

volatile是一個特殊的修飾符,只有成員變量才能使用它。

在Java并發程序缺少同步類的情況下,多線程對成員變量的操作對其它線程是透明的。

volatile變量可以保證下一個讀取操作會在前一個寫操作之后發生。

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

首先,volatile 變量和 atomic 變量看起來很像,但功能卻不一樣。

Volatile變量可以確保先行關系,即寫操作會發生在后續的讀操作之前, 但它并不能保證原子性。例如用volatile修飾count變量那么 count++ 操作就不是原子性的。

而AtomicInteger類提供的atomic方法可以讓這種操作具有原子性如getAndIncrement()方法會原子性的進行增量操作把當前值加一,其它數據類型和引用變量也可以進行相似操作。

3.Java中的同步集合與并發集合有什么區別?

同步集合與并發集合都為多線程和并發提供了合適的線程安全的集合,不過并發集合的可擴展性更高。

Java5介紹了并發集合像ConcurrentHashMap,不僅提供線程安全還用鎖分離和內部分區等現代技術提高了可擴展性。

4.Vector是一個線程安全類嗎?

Vector 是用同步方法來實現線程安全的

5.ReadWriteLock是什么?

一般而言,讀寫鎖是用來提升并發程序性能的鎖分離技術的成果。

Java中的ReadWriteLock是Java 5 中新增的一個接口,一個ReadWriteLock維護一對關聯的鎖,一個用于只讀操作一個用于寫。在沒有寫線程的情況下一個讀鎖可能會同時被多個讀線程持有。寫鎖是獨占的,你可以使用JDK中的ReentrantReadWriteLock來實現這個規則,它最多支持65535個寫鎖和65535個讀鎖。

6.什么是FutureTask?

在Java并發程序中FutureTask表示一個可以取消的異步運算。

它有啟動和取消運算、查詢運算是否完成和取回運算結果等方法。只有當運算完成的時候結果才能取回,如果運算尚未完成get方法將會阻塞。一個FutureTask對象可以對調用了Callable和Runnable的對象進行包裝,由于FutureTask也是調用了Runnable接口所以它可以提交給Executor來執行。

7.什么是ThreadLocal變量?

ThreadLocal是Java里一種特殊的變量。

每個線程都有一個ThreadLocal就是每個線程都擁有了自己獨立的一個變量,競爭條件被徹底消除了。它是為創建代價高昂的對象獲取線程安全的好方法,比如你可以用ThreadLocal讓SimpleDateFormat變成線程安全的,因為那個類創建代價高昂且每次調用都需要創建不同的實例所以不值得在局部范圍使用它,如果為每個線程提供一個自己獨有的變量拷貝,將大大提高效率。

首先,通過復用減少了代價高昂的對象的創建個數。 其次,你在沒有使用高代價的同步或者不變性的情況下獲得了線程安全。

線程局部變量的另一個不錯的例子是ThreadLocalRandom類,它在多線程環境中減少了創建代價高昂的Random對象的個數。

8.什么是Java線程轉儲(Thread Dump),如何得到它?

線程轉儲是一個JVM活動線程的列表,它對于分析系統瓶頸和死鎖非常有用。

有很多方法可以獲取線程轉儲——使用Profiler,Kill-3命令,jstack工具等等。有的更喜歡jstack工具,因為它容易使用并且是JDK自帶的。由于它是一個基于終端的工具,所以可以編寫一些腳本去定時的產生線程轉儲以待分析。

9.如果你提交任務時,線程池隊列已滿。會時發會生什么?

如果你使用的LinkedBlockingQueue,也就是×××隊列的話,沒關系,繼續添加任務到阻塞隊列中等待執行,因為LinkedBlockingQueue可以近乎認為是一個無窮大的隊列,可以無限存放任務;

如果你使用的是有界隊列比方說ArrayBlockingQueue的話,任務首先會被添加到ArrayBlockingQueue中,ArrayBlockingQueue滿了,則會使用拒絕策略RejectedExecutionHandler處理滿了的任務,默認是AbortPolicy。

10.線程之間是如何通信的?

當線程間是可以共享資源時,線程間通信是協調它們的重要的手段。

Object類中wait()notify()notifyAll()方法可以用于線程間通信關于資源的鎖的狀態。

11.怎么檢測一個線程是否持有對象監視器

Thread類提供了一個holdsLock(Object obj)方法,當且僅當對象obj的監視器被某條線程持有的時候,才會返回true.注意這是一個static方法,這意味著”某條線程”指的是當前線程。

12.什么是死鎖(Deadlock)?

死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

鎖的分類

1、自旋鎖 2、自旋鎖的其他種類 3、阻塞鎖 4、可重入鎖 5、讀寫鎖 6、互斥鎖 7、悲觀鎖 8、樂觀鎖 9、公平鎖 10、非公平鎖 11、偏向鎖 12、對象鎖 13、線程鎖 14、鎖粗化 15、輕量級鎖 16、鎖消除 17、鎖膨脹 18、信號量

死鎖發生的幾個條件是什么

  • 因為系統資源不足。

  • 進程運行推進的順序不合適。

  • 資源分配不當。

實現一個死鎖?

產生死鎖的四個必要條件:

  • 互斥條件:所謂互斥就是進程在某一時間內獨占資源。

  • 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

  • 不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。

  • 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

13.如何避免死鎖?

打破產生死鎖的四個必要條件中的一個或幾個,保證系統不會進入死鎖狀態。

  1. 打破互斥條件。即允許進程同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像打印機等等,這是由資源本身的屬性所決定的。所以,這種辦法并無實用價值。

  2. 打破不可搶占條件。即允許進程強行從占有者那里奪取某些資源。就是說,當一個進程已占有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所占有的全部資源,以后再重新申請。它所釋放的資源可以分配給其它進程。這就相當于該進程占有的資源被隱蔽地強占了。這種預防死鎖的方法實現起來困難,會降低系統性能。

  3. 打破占有且申請條件。可以實行資源預先分配策略。即進程在運行前一次性地向系統申請它所需要的全部資源。如果某個進程所需的全部資源得不到滿足,則不分配任何資源,此進程暫不運行。只有當系統能夠滿足當前進程的全部資源需求時,才一次性地將所申請的資源全部分配給該進程。由于運行的進程已占有了它所需的全部資源,所以不會發生占有資源又申請資源的現象,因此不會發生死鎖。 四.打破循環等待條件,實行資源有序分配策略。采用這種策略,即把資源事先分類編號,按號分配,使進程在申請,占用資源時不會形成環路。所有進程對資源的請求必須嚴格按資源序號遞增的順序提出。進程占用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。

14.Java中活鎖和死鎖有什么區別?

活鎖和死鎖類似,不同之處在于處于活鎖的線程或進程的狀態是不斷改變的,活鎖可以認為是一種特殊的饑餓。

一個現實的活鎖例子是兩個人在狹小的走廊碰到,兩個人都試著避讓對方好讓彼此通過,但是因為避讓的方向都一樣導致最后誰都不能通過走廊。

簡單的說就是,活鎖和死鎖的主要區別是前者進程的狀態可以改變但是卻不能繼續執行。

15.死鎖與饑餓的區別?

饑餓是指系統不能保證某個進程的等待時間上界,從而使該進程長時間等待,當等待時間給進程推進和響應帶來明顯影響時,稱發生了進程饑餓。當饑餓到一定程度的進程所賦予的任務即使完成也不再具有實際意義時稱該進程被餓死。

死鎖是指在多道程序系統中,一組進程中的每一個進程都無限期等待被該組進程中的另一個進程所占有且永遠不會釋放的資源。

相同點:二者都是由于競爭資源而引起的。

不同點:

  • 從進程狀態考慮,死鎖進程都處于等待狀態,忙等待(處于運行或就緒狀態)的進程并非處于等待狀態,但卻可能被餓死;

  • 死鎖進程等待永遠不會被釋放的資源,餓死進程等待會被釋放但卻不會分配給自己的資源,表現為等待時限沒有上界(排隊等待或忙式等待);

  • 死鎖一定發生了循環等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有進程餓死;

  • 死鎖一定涉及多個進程,而饑餓或被餓死的進程可能只有一個。

  • 在饑餓的情形下,系統中有至少一個進程能正常運行,只是饑餓進程得不到執行機會。而死鎖則可能會最終使整個系統陷入死鎖并崩潰。

16.什么是樂觀鎖和悲觀鎖

悲觀鎖:假定會發生并發沖突,屏蔽一切可能違反數據完整性的操作。 樂觀鎖:假設不會發生并發沖突,只在提交操作時檢查是否違反數據完整性。樂觀鎖不能解決臟讀的問題。

17.什么是對象鎖?

對象鎖是指Java為臨界區synchronized(Object)語句指定的對象進行加鎖,對象鎖是獨占排他鎖。

對于對象鎖,是針對一個對象的,它只在該對象的某個內存位置聲明一個標志位標識該對象是否擁有鎖,所以它只會鎖住當前的對象。一般一個對象鎖是對一個非靜態成員變量進行syncronized修飾,或者對一個非靜態方法進行syncronized修飾。對于對象鎖,不同對象訪問同一個被syncronized修飾的方法的時候不會阻塞住。

18.怎么檢測一個線程是否擁有鎖?

在java.lang.Thread中有一個方法叫holdsLock(),它返回true如果當且僅當當前線程擁有某個具體對象的鎖。

19.Java中synchronized 和 ReentrantLock 有什么不同?

Java在過去很長一段時間只能通過synchronized關鍵字來實現互斥,它有一些缺點。比如你不能擴展鎖之外的方法或者塊邊界,嘗試獲取鎖時不能中途取消等。Java 5 通過Lock接口提供了更復雜的控制來解決這些問題。 ReentrantLock 類實現了 Lock,它擁有與 synchronized 相同的并發性和內存語義且它還具有可擴展性。

20.可重入鎖的含義

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之后 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。

在Java環境下 ReentrantLock 和synchronized 都是可重入鎖

21.什么是CAS

CAS,全稱為Compare and Swap,即比較-替換。假設有三個操作數:內存值V、舊的預期值A、要修改的值B,當且僅當預期值A和內存值V相同時,才會將內存值修改為B并返回true,否則什么都不做并返回false。當然CAS一定要volatile變量配合,這樣才能保證每次拿到的變量是主內存中最新的那個值,否則舊的預期值A對某條線程來說,永遠是一個不會變的值A,只要某次CAS操作失敗,永遠都不可能成功


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锡林郭勒盟| 莒南县| 河北省| 思南县| 聂拉木县| 拉孜县| 大足县| 临洮县| 息烽县| 石台县| 大兴区| 大关县| 镇赉县| 曲阳县| 襄樊市| 静乐县| 安陆市| 延安市| 灯塔市| 鄱阳县| 遵义县| 措勤县| 车险| 扎赉特旗| 攀枝花市| 特克斯县| 牙克石市| 大田县| 开化县| 阳谷县| 通州市| 沂源县| 明光市| 滦平县| 衡水市| 车险| 格尔木市| 泌阳县| 武邑县| 凤冈县| 营口市|