天天看點

synchronized的使用及死鎖現象

本程式轉自尚學堂馬老師課上代碼

synchronized的使用:

synchronized執行這個方法時,目前對象被鎖定

public class TestSync implements Runnable {

  Timer timer = new Timer();

  public static void main(String[] args) {

    TestSync test = new TestSync();

    Thread t1 = new Thread(test);

    Thread t2 = new Thread(test);

    t1.setName("t1");

    t2.setName("t2");

    t1.start();

    t2.start();

  }

  public void run(){

    timer.add(Thread.currentThread().getName());

  }

}

class Timer{

  private static int num = 0;

  //synchronized執行這個方法時,目前對象被鎖定

  public synchronized void add(String name){

   num ++;

      try {Thread.sleep(1);}

   catch (InterruptedException e) {}

   System.out.println(name+", 你是第"+num+"個使用timer的線程");  

  }

}

死鎖現象模拟程式:

public class TestDeadLock implements Runnable {

 public int flag = 1;

 static Object o1 = new Object(), o2 = new Object();

 public void run() {

        System.out.println("flag=" + flag);

        //鎖住o1,同時鎖住了o2

  if(flag == 1) {

   //synchronized 鎖方法

   synchronized(o1) {

    try {

     Thread.sleep(500);

    } catch (Exception e) {

     e.printStackTrace();

    }

    synchronized(o2) {

     System.out.println("1"); 

    }

   }

  }

  //鎖住o2,同時鎖住了o1

  if(flag == 0) {

   synchronized(o2) {

    try {

     Thread.sleep(500);

    } catch (Exception e) {

     e.printStackTrace();

    }

    synchronized(o1) {

     System.out.println("0");

    }

   }

  }

 } 

 public static void main(String[] args) {

  TestDeadLock td1 = new TestDeadLock();

  TestDeadLock td2 = new TestDeadLock();

  td1.flag = 1;

  td2.flag = 0;

  Thread t1 = new Thread(td1);

  Thread t2 = new Thread(td2);

  t1.start();

  t2.start();

 }

}