Java 實現執行緒死鎖
概述
春節的時候去面試了一家公司,筆試題裡面有一道是使用簡單的程式碼實現執行緒的‘死鎖’,當時沒有想到這道題考的是Synchronized關鍵字,於是自己定義了兩個資源模擬了一下。後面想想腸子都悔青了,於是自己在電腦上敲了一遍,同時也是對自己的一個提醒,基礎功夫還不夠紮實。
Synchronized關鍵字
Java語言的關鍵字,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。
- 當兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。
- 然而,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該object中的非synchronized(this)同步程式碼塊。
- 尤其關鍵的是,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼塊的訪問將被阻塞。
- 第三個例子同樣適用其它同步程式碼塊。也就是說,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步程式碼部分的訪問都被暫時阻塞。
- 以上規則對其它物件鎖同樣適用.
程式碼示例
package test160118; public class TestSynchronized { public static void main(String[] args) { Sy sy = new Sy(0); Sy sy2 = new Sy(1); sy.start(); sy2.start(); } } class Sy extends Thread { private int flag ; static Object x1 = new Object(); static Object x2 = new Object(); public Sy(int flag) { this.flag = flag; } @Override public void run() { System.out.println(flag); try { if (flag == 0) { synchronized (x1) { System.out.println(flag+"鎖住了x1"); Thread.sleep(1000); synchronized (x2) { System.out.println(flag+"鎖住了x2"); } System.out.println(flag+"釋放了x1和x2"); } } if(flag == 1) { synchronized (x2) { System.out.println(flag+"鎖住了x2"); Thread.sleep(1000); synchronized (x1) { System.out.println(flag+"鎖住了x1"); } System.out.println(flag+"釋放了x1和x2"); } } } catch (InterruptedException e) { e.printStackTrace(); } } }
總結
總之說多了都是淚,關鍵不是我不會而是我沒有想到它考的都是這個。也不知道面試過沒過,有點方。後面會陸陸續續把之前面試時答得不是很好的幾道題寫成專欄的。
相關文章
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- Java多執行緒7:死鎖Java執行緒
- Java多執行緒-死鎖的出現和解決Java執行緒
- Java執行緒面試題(02) Java執行緒中如何避免死鎖Java執行緒面試題
- java 執行緒淺解03[執行緒同步以及經典死鎖]Java執行緒
- 執行緒中的死鎖執行緒
- GCD&&執行緒死鎖GC執行緒
- GCD 之執行緒死鎖GC執行緒
- 如何處理執行緒死鎖執行緒
- JAVA CPU100%與執行緒死鎖定位Java執行緒
- 23、Java併發性和多執行緒-重入鎖死Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- 多執行緒死鎖除錯小技巧執行緒除錯
- java多執行緒中的死鎖、活鎖、飢餓、無鎖都是什麼鬼?Java執行緒
- java執行緒實現方式Java執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- java 執行緒鎖物件鎖的理解Java執行緒物件
- Java 執行緒安全 與 鎖Java執行緒
- java多執行緒–同步鎖Java執行緒
- Java多執行緒-無鎖Java執行緒
- Java執行緒之鎖研究Java執行緒
- 多執行緒-死鎖問題概述和使用執行緒
- 託管C++執行緒鎖實現C++執行緒
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- 死磕 java執行緒系列之執行緒的生命週期Java執行緒
- 誰在死鎖Mutex——用Windbg查詢Mutex死鎖所有者執行緒Mutex執行緒
- Java多執行緒實現方式Java執行緒
- Java多執行緒的實現Java執行緒
- Java中ThreadLocal無鎖化執行緒封閉實現原理Javathread執行緒
- 作業系統複習(程式、執行緒、死鎖)作業系統執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java併發程式設計實戰--通過執行緒轉儲資訊來分析死鎖Java程式設計執行緒
- Java 執行緒池中的執行緒複用是如何實現的?Java執行緒
- 死磕java底層(一)—多執行緒Java執行緒