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]