线程同步
java 编程语言其中一个优点就是提供了语言层面的多线程支持。多线程支持主要是围绕synchronization来展开的:在多个线程之间协调数据访问。java用来实现同步的机制我们称作为monitor.本文将介绍monitor以及java虚拟机是如何使用monitor的——有指令集支持的数据加锁与解锁。
monitor
java监视器(monitor)支持两种类型的线程同步,互斥与协作,互斥:java虚拟机通过object 锁来实现互斥,允许多个线程在共享数据上不相互干扰的work;协作:java虚拟机通过object类的的wait(), notify()方法来实现多线程一起work。
一个monitor就想一个房子,房子中有一间特别的房间,这个房间仅仅能够同时被一个线程占据。这个房间一般情况下包含以下数据;从这个线程进入房间到离开房间,里面的数据时排他的,只有这个线程可以访问。进入这个房子我们称之为进入监视器(Entering the monitor), 进入房间我们称之为获得监视器(acquiring the monitor),占有这个房间我们称之为拥有监视器(owning the monitor),离开房间,我们称之为释放监视器(releasing the monitor),离开整个房子,我们称之为退出监视器(exiting the monitor)。
除了与数据相关,monitor也与代码相关,本文中将这个代码称为监视区(monitor regions).监视区是监视器了一组不可分割的执行操作。换句话说,一个线程从开始执行监视区到执行完成的这段时间,其他的线程不能执行该监视器的监视区。监视器确保了同时只有一个线程执行这个监视区。