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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java线程死锁_Java并发:隐藏线程死锁

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java线程死锁_Java并发:隐藏线程死锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java線程死鎖

大多數Java程序員熟悉Java線程死鎖概念。 它本質上涉及2個線程,它們彼此永遠等待。 這種情況通常是平面(同步)或ReentrantLock(讀或寫)鎖排序問題的結果。

Found one Java-level deadlock: ============================= "pool-1-thread-2":waiting to lock monitor 0x0237ada4 (object 0x272200e8, a java.lang.Object),which is held by "pool-1-thread-1" "pool-1-thread-1":waiting to lock monitor 0x0237aa64 (object 0x272200f0, a java.lang.Object),which is held by "pool-1-thread-2"

好消息是,HotSpot JVM始終可以為您檢測到這種情況……還是嗎? 最近一個影響Oracle Service Bus生產環境的線程死鎖問題迫使我們重新審視此經典問題并確定“隱藏”死鎖情況的存在。 本文將通過一個簡單的Java程序演示并復制非常特殊的鎖順序死鎖條件,最新的HotSpot JVM 1.7并未檢測到該情況。 您還可以在本文結尾處找到一個視頻 ,向您介紹Java示例程序以及所使用的故障排除方法。

犯罪現場

我通常喜歡將主要的Java并發問題與犯罪現場進行比較,在犯罪現場您扮演首席調查員的角色。 在這種情況下,“犯罪”是客戶IT環境的實際生產中斷。 您的工作是:

  • 收集所有證據,提示和事實(線程轉儲,日志,業務影響,負載數字…)
  • 詢問證人和領域專家(支持團隊,交付團隊,供應商,客戶...)

調查的下一步是分析收集的信息,并建立一個或多個“嫌疑人”的潛在清單以及明確的證據。 最終,您希望將其范圍縮小到主要可疑或根本原因。 顯然,“直到證明有罪之前無罪”的法律在這里并不適用,恰恰相反。 缺乏證據可能會阻止您實現上述目標。 接下來,您將看到Hotspot JVM缺少死鎖檢測,并沒有必要證明您沒有解決此問題。

犯罪嫌疑人

在此故障排除上下文中,“可疑”定義為具有以下有問題的執行模式的應用程序或中間件代碼。

  • 使用FLAT鎖,然后使用ReentrantLock WRITE鎖(執行路徑#1)
  • 使用ReentrantLock READ鎖,然后使用FLAT鎖(執行路徑#2)
  • 由2個Java線程并發執行,但執行順序相反

上面的鎖排序死鎖標準可以如下所示:

現在,讓我們通過示例Java程序來復制此問題,并查看JVM線程轉儲輸出。

示例Java程序

上面的死鎖條件是首先從我們的Oracle OSB問題案例中發現的。 然后,我們通過一個簡單的Java程序重新創建了它。 您可以在此處 下載我們程序的完整源代碼。 該程序只是創建并觸發2個工作線程。 它們每個執行不同的執行路徑,并嘗試以不同的順序獲取共享對象上的鎖。 我們還創建了一個死鎖檢測器線程以進行監視和記錄。 現在,在下面找到實現2條不同執行路徑的Java類。

package org.ph.javaee.training8;import java.util.concurrent.locks.ReentrantReadWriteLock;/*** A simple thread task representation* @author Pierre-Hugues Charbonneau**/ public class Task {// Object used for FLAT lockprivate final Object sharedObject = new Object();// ReentrantReadWriteLock used for WRITE & READ locksprivate final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();/*** Execution pattern #1*/public void executeTask1() {// 1. Attempt to acquire a ReentrantReadWriteLock READ locklock.readLock().lock();// Wait 2 seconds to simulate some work...try { Thread.sleep(2000);}catch (Throwable any) {}try { // 2. Attempt to acquire a Flat lock...synchronized (sharedObject) {}}// Remove the READ lockfinally {lock.readLock().unlock();} System.out.println("executeTask1() :: Work Done!");}/*** Execution pattern #2*/public void executeTask2() {// 1. Attempt to acquire a Flat locksynchronized (sharedObject) { // Wait 2 seconds to simulate some work...try { Thread.sleep(2000);}catch (Throwable any) {}// 2. Attempt to acquire a WRITE lock lock.writeLock().lock();try {// Do nothing}// Remove the WRITE lockfinally {lock.writeLock().unlock();}}System.out.println("executeTask2() :: Work Done!");}public ReentrantReadWriteLock getReentrantReadWriteLock() {return lock;} }

一旦觸發死鎖情況,就會使用JVisualVM生成JVM線程轉儲。

從Java線程轉儲示例中可以看到。 JVM沒有檢測到此死鎖條件(例如,不存在“發現一個Java級死鎖”),但是很明顯,這兩個線程處于死鎖狀態。

根本原因:ReetrantLock READ鎖定行為

至此,我們發現的主要解釋與ReetrantLock READ鎖的用法有關。 讀取鎖通常不設計為具有所有權概念。 由于沒有哪個線程持有讀取鎖的記錄,因此這似乎可以防止HotSpot JVM死鎖檢測器邏輯檢測到涉及讀鎖的死鎖。 從那時起就實現了一些改進,但是我們可以看到JVM仍然無法檢測到這種特殊的死鎖情況。 現在,如果我們用寫鎖替換程序中的讀鎖(執行模式2),那么JVM將最終檢測到死鎖情況,但是為什么呢?

Found one Java-level deadlock: ============================= "pool-1-thread-2":waiting for ownable synchronizer 0x272239c0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),which is held by "pool-1-thread-1" "pool-1-thread-1":waiting to lock monitor 0x025cad3c (object 0x272236d0, a java.lang.Object),which is held by "pool-1-thread-2"Java stack information for the threads listed above: =================================================== "pool-1-thread-2":at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x272239c0> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)at java.util.concurrent.locks.AbstractQueuedSynchronizer. parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)at java.util.concurrent.locks.AbstractQueuedSynchronizer. acquireQueued(AbstractQueuedSynchronizer.java:867)at java.util.concurrent.locks.AbstractQueuedSynchronizer. acquire(AbstractQueuedSynchronizer.java:1197)at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)at org.ph.javaee.training8.Task.executeTask2(Task.java:54)- locked <0x272236d0> (a java.lang.Object)at org.ph.javaee.training8.WorkerThread2.run(WorkerThread2.java:29)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722) "pool-1-thread-1":at org.ph.javaee.training8.Task.executeTask1(Task.java:31)- waiting to lock <0x272236d0> (a java.lang.Object)at org.ph.javaee.training8.WorkerThread1.run(WorkerThread1.java:29)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)

這是因為JVM跟蹤寫入鎖類似于平面鎖。 這意味著HotSpot JVM死鎖檢測器似乎當前被設計用來檢測:

  • 對象監視器上涉及FLAT鎖的死鎖
  • 死鎖涉及與WRITE鎖關聯的鎖定的可擁有同步器

缺少讀取鎖每線程跟蹤似乎可以防止這種情況下的死鎖檢測,并大大增加了故障排除的復雜性。 我建議您閱讀Doug Lea在整個問題上的評論 ,因為早在2005年,人們就開始擔心由于某些潛在的鎖定開銷而可能增加按線程讀取保持跟蹤的可能性。 如果您懷疑涉及讀取鎖的隱藏死鎖情況,請在下面的故障排除建議中查找:

  • 仔細分析線程調用堆棧跟蹤,它可能會揭示某些代碼潛在地獲取讀鎖,并阻止其他線程獲取寫鎖。
  • 如果您是代碼的所有者,請通過使用lock.getReadLockCount()方法來跟蹤讀取鎖的計數。

我期待著您的反饋,特別是對于具有此類涉及讀鎖的死鎖經驗的個人。 最后,在下面的視頻中找到通過示例Java程序的執行和監視來解釋這些發現的視頻。


參考: Java并發性: Java EE支持模式和Java教程博客中,我們的JCG合作伙伴 Pierre-Hugues Charbonneau 隱藏的線程死鎖 。

翻譯自: https://www.javacodegeeks.com/2013/02/java-concurrency-the-hidden-thread-deadlocks.html

java線程死鎖

總結

以上是生活随笔為你收集整理的java线程死锁_Java并发:隐藏线程死锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产亚洲av久一一区 | 久久婷婷五月综合 | 三级全黄视频 | 竹菊影视一区二区三区 | av午夜在线观看 | 亚洲欧洲在线视频 | 国产福利久久久 | 成人毛片在线播放 | 精品一区二区三区入口 | 欧美精品乱码 | 图书馆的女友在线观看 | 欧美片免费网站 | 双女主黄文 | 日韩在线视频网址 | 99久久精品一区 | 亚洲成人免费av | 国产精品国色综合久久 | 欧美精品一区二区在线播放 | 国产精品视频看看 | 豆花免费跳转入口官网 | 天天爽天天搞 | 欧美成人极品 | 欧美熟妇精品一区二区蜜桃视频 | 五月天综合网 | 国产裸体永久免费无遮挡 | 欧美俄罗斯乱妇 | 北条麻妃一二三区 | 日韩特黄 | 久久刺激 | 国产第一区第二区 | 成人在线观看18 | 恶虐女帝安卓汉化版最新版本 | 四虎永久网址 | 五月色丁香 | av在线资源观看 | 欧美影院一区二区三区 | 少妇厨房愉情理伦bd在线观看 | 高潮无码精品色欲av午夜福利 | 亚洲一区二区三区婷婷 | 欧美成人一二区 | 在线黄色大片 | 爆操女秘书 | 手机看片在线观看 | 成年人av在线播放 | 狠狠入| 中文字幕av久久爽一区 | 九九国产| 日韩一中文字幕 | 久久久久久久久久久影院 | 国产精品美女网站 | 日韩精品一区二区三区在线视频 | 女性女同性aⅴ免费观女性恋 | 嫩草影院懂你的 | 精品乱码一区二区三区 | 加勒比一区在线 | 青青艹av| 天天做天天摸天天爽天天爱 | 精品少妇人妻av一区二区 | 欧美粗暴se喷水 | 大桥未久av一区二区三区中文 | 国产日本一区二区 | 国产午夜免费视频 | 国产精品一区二区在线观看 | 日本在线播放视频 | 三级全黄做爰龚玥菲在线 | 亚洲好看站 | 李丽珍裸体午夜理伦片 | 高潮一区二区三区乱码 | 国产精品99无码一区二区 | 韩国三级丰满少妇高潮 | 名人明星三级videos | 美女丝袜av| 日本视频免费看 | 少妇xxx | 在线观看亚洲免费视频 | 欧美久草| 孕妇丨91丨九色 | 91免费看国产 | 日韩三级av在线 | 日本高潮视频 | 99久久精品一区二区成人 | www久久久久久久 | 欧洲黄色录像 | 免费在线看a | 朱竹清到爽高潮痉挛 | 性一交一乱一色一免费无遮挡 | 一区二区三区在线视频观看 | 男生女生操操操 | 99久99| 99看片| 成人免费视频一区二区三区 | 久久久国产精品黄毛片 | 大黑人交交护士xxxxhd | 私密按摩massagexxx| 久草www| av私库在线观看 | 污视频网站在线看 | 可以免费看av | www.我爱av|