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]