国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

java避免死鎖的常見方法代碼解析

2024-07-13 10:15:48
字體:
來源:轉載
供稿:網友

死鎖

索是一個非常有用的工具,運用場景非常多,因為它使用起來非常簡單,而且易于理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產生死鎖,就會造成系統功能不可用。讓我們先來看一段代碼,這段代碼會引起死鎖,使線程 thread_1 和線程 thread_2 互相等待對方釋放鎖。

java;">package thread;public class DeadLockDemo {	private static String A = "A";	private static String B = "B";	public static void main(String args[]) {		new DeadLockDemo().deadLock();	}	private void deadLock() {		// 線程thread_1 		Thread thread_1 = new Thread(new Runnable() {			@Override 			   public void run() {				synchronized (A) {					System.err.println("--thread_1 lock A----");					synchronized (B) {						System.err.println("--thread_1 lock B----");					}				}			}		}		);		// 線程thread_2 		Thread thread_2 = new Thread(new Runnable() {			@Override 			   public void run() {				synchronized (B) {					System.out.println("--thread_2 lock B----");					synchronized (A) {						System.out.println("--thread_2 lock A----");					}				}			}		}		);		thread_1.start();		thread_2.start();	}}

這段代碼只是演示死鎖的場景,在現實中你可能不會寫出這樣的代碼。但是在一些更為復雜的場景中,你可能會遇到這樣的問題,比如 thread_1 拿到索之后,因為一些異常情況沒有釋放索(死循環)。又或者是 thread_1 拿到一個數據庫索,釋放鎖的時候拋出了異常,沒釋放掉。

一旦出現死鎖,業務是可感知的,因為不能繼續提供服務了,那么只能通過dump 線程查看到底是哪個線程出現了問題,以下線程信息告訴我們是 DeadLockDemo類的第 35 行和21行引起了死鎖。

"Thread-1" prio=6 tid=0x000000000cb13800 nid=0x19ac waiting for monitor entry [0 x000000000d67f000]  java.lang.Thread.State: BLOCKED (on object monitor)   at thread.DeadLockDemo$2.run(DeadLockDemo.java:35)   - waiting to lock <0x00000007d5a9be88> (a java.lang.String)   - locked <0x00000007d5a9beb8> (a java.lang.String)   at java.lang.Thread.run(Unknown Source)  "Thread-0" prio=6 tid=0x000000000cb0e800 nid=0x6bc waiting for monitor entry [0x 000000000d48f000]  java.lang.Thread.State: BLOCKED (on object monitor)   at thread.DeadLockDemo$1.run(DeadLockDemo.java:21)   - waiting to lock <0x00000007d5a9beb8> (a java.lang.String)   - locked <0x00000007d5a9be88> (a java.lang.String)   at java.lang.Thread.run(Unknown Source) 

避免死鎖的幾個常見方法。

避免一個線程同時獲取多個鎖。

避免一個線程在索內同時占用多個資源,盡量保證每個索只占用一個資源。

嘗試使用定時索,使用 lock.tryLock(timeout) 來替代使用內部索機制。

對于數據庫索,加鎖和解鎖必須在一個數據庫連接里,否則會出現解鎖失敗的情況。

總結

以上就是本文關于java避免死鎖的常見方法代碼解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博湖县| 灯塔市| 东方市| 阿拉尔市| 类乌齐县| 岳池县| 保靖县| 泗阳县| 新和县| 靖西县| 海盐县| 安新县| 安岳县| 宾川县| 泌阳县| 客服| 启东市| 拉萨市| 鹤壁市| 永平县| 尼木县| 关岭| 奉贤区| 金门县| 鄱阳县| 济阳县| 顺义区| 保德县| 吴堡县| 毕节市| 易门县| 平阳县| 禄丰县| 遵化市| 葵青区| 门源| 页游| 屏东市| 灵寿县| 肃宁县| 巩留县|