使用多线程时,有时需要协调两个或多个线程的活动.使线程协调工作的过程称为同步(synchronization).需要同步的最常见的原因是两个或多个线程都需要访问在某一时刻只能由一个线程使用的共享资源.例如,当一个线程正在向一个文件写入时,第二个线程就不能同时向这个文件写入.需要同步的第二个原因是当一个线程正在等待另一个线程引发的事件时.这种情况下,必须有一种方法使第一个线程挂起,直到事件发生为止.然后,等待的线程必须继续执行.
Java中同步的关键是用于控制对象访问的监视器(monitor).监视器通过实现”锁”来工作.当一个对象被一个线程锁住以后,其他线程就不能访问该对象.当该线程退出时,要为对象解锁,使其他线程可以访问他.
Java中的所有对象都拥有一个监视器.该功能已经内置于Java语言本身.因此,可以同步所有的对象.关键字synchronization和所有对象都具备的几个定义良好的方法都支持同步.因为同步在一开始就设计到Java中,所以使用他比你所想象的要简单.事实上,对于许多程序,对象的同步几乎是透明的.
同步代码的方法有两种,两种方法都使用了关键字synchronization.