synchronized实现了管程的机制,所谓管程,在《现代操作系统》p66~p68有介绍:
管程是一种高级同步原语。管程中包括过程、变量即数据结构。
你可以访问它的过程,但是不能在管程以外的过程中访问他的数据结构。(可以认为这些数据结构是private的)
它由一个主要特征:当一个进程调用管程过程时,该过程的前几条指令将检查在管程中是否有其他进程,如果有,调用进程阻塞,如果没有,调用进程进入管程。
所以我们只需将所有的临界区转换成管程即可,让编译器来完成互斥。
java语言支持管程,就是用synchronized关键字。
只要将关键字加入到方法声明中,java保证一旦某个线程执行该方法,就不允许其他线程执行该类中的任何synchronized方法。
synchornized(Object){/**.....*/}是控制程序块的互斥访问,访问花括号里程序片段的线程必须先要获得参数中的Object对象,并对其加锁,所以其他线程要访问程序段时,就要等Object对象出于未被锁定状态才能获得它并访问临界区(共享的代码片段)。