尽管在创建的类总创建synchronized方法是实现同步的一种简单有效的方法,但这并不适用于所有情况.例如,可能需要对某些不被synchronized修改的方法的访问进行同步.在想使用由第三方创建的类,而无法访问源代码时就会出现这种情况.因此,对你而言,在类中将synchronized添加到相应的方法中是不可能的.如果同步访问这种类的对象呢?很幸运,这个问题的解决方法很简单:只需把对这种类定义的方法的调用放入synchronized代码块即可.
下面是synchronized代码块的基本形式:
synchronized(objerf) { //statements to be synchronized }
这里,objref是对被同步对象的引用.一旦进入同步代码块,在退出该块之前,其他线程将不能再调用objref引用的对象的同步方法.
例如,另一种对sumArray()同步调用的方法是从同步代码块中调用他,该版本的程序如下所示:
public class test2 { // @param args public static void main(String args[]) { int a[] = {1,2,3,4,5}; MyThread mt1 = new MyThread("child#1",a); MyThread mt2 = new MyThread("child#2",a); try { mt1.thrd.join(); mt2.thrd.join(); }catch(InterruptedException exc) { System.out.println("error"); } } } class SumArray { private int sum; int sumArray(int nums[]) { for(int i=0;i<nums.length;i++) { sum += nums[i]; System.out.println("tunning total for "+Thread.currentThread().getName()+"is "+sum); try { Thread.sleep(10); }catch(InterruptedException exc) { System.out.println("thread interrupted"); } } return sum; } } class MyThread implements Runnable { Thread thrd; static SumArray sa = new SumArray(); int a[]; int answer; MyThread(String name,int nums[]) { thrd = new Thread(this,name); a = nums; thrd.start(); } public void run() { int sum; System.out.println(thrd.getName()+" starting"); synchronized(sa) { answer = sa.sumArray(a); } System.out.println("Sum for "+thrd.getName()+" is "+answer); } }
问:我听说过并发工具,他们是什么>另外,什么是Fork/Join框架?
答:并发工具打包在Java.util.concurrent(及其子包)中,支持并发程序设计.与其他几种工具一起,他们提供了同步器,线程池,执行管理器和锁来扩展程序员对线程执行的控制.并发API最令人激动的特性就是FORK/JOIN框架.
FORK/JOIN框架支持所谓的并行编程,这个术语通常指的是利用包含两个或更多个处理器的计算机将一个任务划分为多个子任务的技术,每个子任务都在自己的处理器上执行.可以想象,这种方法可以带来极高的吞吐量和性能.FORK/JOIN框架的主要优势在于易于使用,他简化了可以自动伸缩以利用系统中的处理器数量的多线程代码的开发.因此,他有助于为一些常见程序设计任务创建并发解决方案,例如对数组的元素执行操作.在有了更多的多线程开发经验后,应该仔细研究并发工具,热别是FORK/JOIN框架.