java 執行緒淺解03[執行緒同步以及經典死鎖]
執行緒中通過新增synchronized關鍵字來新增鎖,可以鎖物件,鎖方法,如下所示
package com.thread; //執行緒同步 synchronized public class Thread06_synchronized implements Runnable { Timeer t1=new Timeer(); public static void main(String[] args) { Thread06_synchronized ts=new Thread06_synchronized(); Thread t2=new Thread(ts); Thread t3=new Thread(ts); t2.setName("t1"); t3.setName("t2"); t2.start(); t3.start(); } public void run() { t1.add(Thread.currentThread().getName()); } } class Timeer{ private static int num=0; public void add(String name){ synchronized(this){ num++; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name+",你是第"+num+"使用這個物件滴"); } } }
執行結果: t1,你是第1使用這個物件滴 t2,你是第2使用這個物件滴 ps:可將鎖關鍵字去掉,檢視結果
案例場景:有兩個物件,兩把鎖,每一把鎖都需要操作兩個物件才能正常,如程式碼
package com.thread; //執行緒同步 synchronized public class Thread06_deadLock implements Runnable { private int flag = 1; static Object o1 = new Object(), o2 = new Object(); public void run() { System.out.println("flag=" + flag); if (flag == 1) { synchronized (o1) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println( flag); } } } if (flag == 0) { synchronized (o2) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(flag); } } } } public static void main(String[] args) { Thread06_deadLock td1=new Thread06_deadLock(); Thread06_deadLock td2=new Thread06_deadLock(); td1.flag=1; td2.flag=0; Thread t1=new Thread(td1); Thread t2=new Thread(td2); t1.start(); t2.start(); } }
執行結果: flag=1 flag=0 就卡住了,形成死鎖,如感興趣滴筒靴可以百度下哲學家吃飯滴問題,更容易理解
內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。
相關文章
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 執行緒中的死鎖執行緒
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 多執行緒03:?執行緒傳參詳解執行緒
- Java執行緒狀態及同步鎖Java執行緒
- java 執行緒淺解01[建立以及啟動]Java執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 如何處理執行緒死鎖執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- JAVA CPU100%與執行緒死鎖定位Java執行緒
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 深入淺出Java多執行緒(十二):執行緒池Java執行緒
- 死磕 java執行緒系列之執行緒的生命週期Java執行緒
- 多執行緒和多執行緒同步執行緒
- 執行緒同步與互斥:互斥鎖執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Java中的執行緒同步詳解Java執行緒
- Java同步之執行緒池詳解Java執行緒
- Java 執行緒安全 與 鎖Java執行緒
- Java中的執行緒同步Java執行緒
- Java 執行緒同步原理探析Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- 淺談 Java多執行緒Java執行緒
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- 最全java多執行緒總結2--如何進行執行緒同步Java執行緒
- C#多執行緒開發-執行緒池03C#執行緒