標籤:java 死結 例子
代碼:
/* * DESCRIPTION : * USER : zhouhui * DATE : 2017/8/2 10:12 */public class DeadLockDemo { public static void main(String[] args) { //分別定義兩個被鎖的對象 Entity entity1 = new Entity("entity1"); Entity entity2 = new Entity("entity2"); //定義兩個線程,並設定不同的名字 new Thread(new MyR(entity1,entity2),"Thread 1").start(); new Thread(new MyR(entity2,entity1),"Thread 2").start(); }}class MyR implements Runnable{ private Entity entity1; private Entity entity2; public MyR(Entity entity1,Entity entity2){ this.entity1 = entity1; this.entity2 = entity2; } public void run() { System.out.println(Thread.currentThread().getName() + "嘗試獲得"+entity1.getName()+"的鎖"); synchronized (entity1){//嘗試獲得第一個鎖 System.out.println(Thread.currentThread().getName() + "獲得"+entity1.getName()+"的鎖"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "嘗試獲得"+entity2.getName()+"的鎖"); synchronized (entity2){//嘗試獲得第二個鎖 System.out.println(Thread.currentThread().getName() + "獲得"+entity2.getName()+"的鎖"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}/** * 定義一個鎖的對象,為了方便區分定義一個name區分對象 */class Entity{ private String name; public Entity(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
列印結果:
Thread 1嘗試獲得entity1的鎖Thread 2嘗試獲得entity2的鎖Thread 1獲得entity1的鎖Thread 2獲得entity2的鎖Thread 2嘗試獲得entity1的鎖Thread 1嘗試獲得entity2的鎖
Java的死結的例子