位置:首頁 > Java技術 > Java教學 > Java線程同步

Java線程同步

當兩個或多個線程需要訪問一個共享的資源,它們需要一些方法來確保該資源在一個時間僅由一個線程訪問。

由這個同步實現的過程被稱為線程同步。

Java中的synchronized關鍵字創建的代碼稱為臨界區的塊。用代碼臨界區每個Java對象獲取與對象關聯的鎖。要進入臨界區,一個線程需要獲得相應的對象的鎖。

同步語句的一般形式為:

synchronized(object) {
   // statements to be synchronized
}

在這裡,對象是一個對象的引用進行同步。 synchronized塊可以確保調用一個方法,是對象的成員隻發生後,當前線程已成功進入對象的監視器。

下麵是一個例子,使用synchronized 塊的run()方法:

// File Name : Callme.java
// This program uses a synchronized block.
class Callme {
   void call(String msg) {
      System.out.print("[" + msg);
      try {
         Thread.sleep(1000);
      } catch (InterruptedException e) {
         System.out.println("Interrupted");
      }
      System.out.println("]");
   }
}

// File Name : Caller.java
class Caller implements Runnable {
   String msg;
   Callme target;
   Thread t;
   public Caller(Callme targ, String s) {
      target = targ;
      msg = s;
      t = new Thread(this);
      t.start();
   }
   
   // synchronize calls to call()
   public void run() {
      synchronized(target) { // synchronized block
         target.call(msg);
      }
   }
}
// File Name : Synch.java
public class Synch {
   public static void main(String args[]) {
      Callme target = new Callme();
      Caller ob1 = new Caller(target, "Hello");
      Caller ob2 = new Caller(target, "Synchronized");
      Caller ob3 = new Caller(target, "World");
   
      // wait for threads to end
      try {
         ob1.t.join();
         ob2.t.join();
         ob3.t.join();
      } catch(InterruptedException e) {
         System.out.println("Interrupted");
      }
   }
}

這將產生以下結果:

[Hello]
[World]
[Synchronized]