欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
java兩種經(jīng)典死鎖例子,Lock發(fā)生死鎖案列

  1. 第一種synchronized方式死鎖:  
  1. 線(xiàn)程thread1先獲取鎖locka,然后在同步塊里嵌套競爭鎖lockb。而線(xiàn)程thread2先獲取鎖lockb,然后在同步塊里嵌套競爭鎖locka  
  1. (此時(shí)已經(jīng)被線(xiàn)程thread1擁有,而thread1在等待lockb,而lockb被thread2擁有,thread2在等待locka……無(wú)線(xiàn)循環(huán))。  
  1. package com.app.test;  
  2.   
  3. import org.apache.poi.util.SystemOutLogger;  
  4.   
  5. /** 
  6.  * Created by lirong5 on 2016/5/24. 
  7.  */  
  8. public class SyncDeadLock{  
  9.     private static Object locka = new Object();  
  10.     private static Object lockb = new Object();  
  11.   
  12.     public static void main(String[] args){  
  13.         new SyncDeadLock().deadLock();  
  14.     }  
  15.   
  16.     private void deadLock(){  
  17.         Thread thread1 = new Thread(new Runnable() {  
  18.             @Override  
  19.             public void run() {  
  20.                 synchronized (locka){  
  21.                     try{  
  22.                         System.out.println(Thread.currentThread().getName()+" get locka ing!");  
  23.                         Thread.sleep(500);  
  24.                         System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");  
  25.                     }catch(Exception e){  
  26.                         e.printStackTrace();  
  27.                     }  
  28.                     System.out.println(Thread.currentThread().getName()+" need lockb!Just waiting!");  
  29.                     synchronized (lockb){  
  30.                         System.out.println(Thread.currentThread().getName()+" get lockb ing!");  
  31.                     }  
  32.                 }  
  33.             }  
  34.         },"thread1");  
  35.   
  36.         Thread thread2 = new Thread(new Runnable() {  
  37.             @Override  
  38.             public void run() {  
  39.                 synchronized (lockb){  
  40.                     try{  
  41.                         System.out.println(Thread.currentThread().getName()+" get lockb ing!");  
  42.                         Thread.sleep(500);  
  43.                         System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");  
  44.                     }catch(Exception e){  
  45.                         e.printStackTrace();  
  46.                     }  
  47.                     System.out.println(Thread.currentThread().getName()+" need locka! Just waiting!");  
  48.                     synchronized (locka){  
  49.                         System.out.println(Thread.currentThread().getName()+" get locka ing!");  
  50.                     }  
  51.                 }  
  52.             }  
  53.         },"thread2");  
  54.   
  55.         thread1.start();  
  56.         thread2.start();  
  57.     }  
  58. }  


執行main方法之后控制臺打印內容如下:

thread1 get locka ing!
thread2 get lockb ing!
thread1 after sleep 500ms!
thread1 need lockb!Just waiting!
thread2 after sleep 500ms!
thread2 need locka! Just waiting!


thread1 need lockb!Just waiting!表明thread1線(xiàn)程進(jìn)入死鎖等待lockb釋放。

thread2 need locka! Just waiting!  表明thread2線(xiàn)程進(jìn)入死鎖等待locka釋放。 


第二種concurrent包Lock錯誤使用,導致死鎖:

lock.unlock();釋放鎖使用地方不規范,導致死鎖不能正常釋放!

  1. package com.app.test;  
  2.   
  3. import java.util.concurrent.locks.Lock;  
  4. import java.util.concurrent.locks.ReentrantLock;  
  5.   
  6. /** 
  7.  * Created by lirong5 on 2016/5/24. 
  8.  */  
  9. public class LockDeadDemo {  
  10.   
  11.     public static void main(String[] args){  
  12.         final DeadLockBean deadLockBean = new DeadLockBean();  
  13.         Thread threadA = new Thread(new Runnable() {  
  14.             @Override  
  15.             public void run() {  
  16.                 try {  
  17.                     Thread.sleep(300);  
  18.                 } catch (InterruptedException e) {  
  19.                     e.printStackTrace();  
  20.                 }  
  21.                 try {  
  22.                     deadLockBean.productDeadLock();  
  23.                 } catch (Throwable throwable) {  
  24.                     throwable.printStackTrace();  
  25.                 }  
  26.             }  
  27.         },"threadA");  
  28.         Thread threadB = new Thread(new Runnable() {  
  29.             @Override  
  30.             public void run() {  
  31.                 try {  
  32.                     Thread.sleep(310);  
  33.                 } catch (InterruptedException e) {  
  34.                     e.printStackTrace();  
  35.                 }  
  36.                 try {  
  37.                     deadLockBean.productDeadLock();  
  38.                 } catch (Throwable throwable) {  
  39.                     throwable.printStackTrace();  
  40.                 }  
  41.             }  
  42.         },"threadB");  
  43.         threadA.start();  
  44.         threadB.start();  
  45.         try {  
  46.             System.out.println("main線(xiàn)程即將被join");  
  47.             threadA.join();  
  48.             threadB.join();  
  49.             System.out.println("main線(xiàn)程從join中恢復");  
  50.         } catch (InterruptedException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54.   
  55.     public static class DeadLockBean{  
  56.         private Lock lock = new ReentrantLock();  
  57.         public void productDeadLock() throws Throwable {  
  58.             System.out.println(Thread.currentThread().getName() + "   進(jìn)入了方法!");  
  59.             lock.lock();  
  60.             try{  
  61.                 System.out.println(Thread.currentThread().getName() + "   已經(jīng)執行了!");  
  62.                 throw new Throwable("人為拋出異常Throwable");//關(guān)鍵代碼行1,  
  63.                 //throw new Exception("人為拋出異常Exception");//關(guān)鍵代碼行2,不會(huì )死鎖,會(huì )在catch(Exception e中被捕獲),嵌套lock.unlock()并釋放  
  64.             }catch(Exception e){  
  65.                 System.out.println(Thread.currentThread().getName()+"   發(fā)生異常catch!");  
  66.                 //lock.unlock();//關(guān)鍵代碼行3,不建議在這里釋放,假如發(fā)生【關(guān)鍵代碼行1】會(huì )產(chǎn)生死鎖  
  67.             }finally{  
  68.                 System.out.println(Thread.currentThread().getName()+"   發(fā)生異常finally!");  
  69.                 lock.unlock();//關(guān)鍵代碼行4,無(wú)論發(fā)生何種異常,均會(huì )釋放鎖。  
  70.             }  
  71.             //lock.unlock();//關(guān)鍵代碼行5,假如發(fā)生不能捕獲異常,將跳出方法體,不執行此處  
  72.             System.out.println(Thread.currentThread().getName() + "   tryCatch外釋放鎖!");  
  73.         }  
  74.     }  
  75. }  


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
線(xiàn)程&線(xiàn)程池&死鎖定位
48_并發(fā)編程-線(xiàn)程-資源共享/鎖
C#線(xiàn)程系列講座(5):同步技術(shù)之Monitor - 哈佛校訓 - 博客園
并發(fā)協(xié)作-死鎖(十五)
內存飆升,罪魁禍首竟是死鎖,這樣檢測和處理減少一半加班時(shí)間
初學(xué)者第64節之線(xiàn)程同步&死鎖詳解(六)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久