管程 (英语:Monitors,也称为监视器) 是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源,主要目的在于保证共享数据安全的情况下减少不必要的互斥控制;需要注意的是monitor不同于事件监听模式
使用场景
如果需要对共享资源实现多个线程互斥的访问,一般会采用Java对象自带的intrinsic lock
实现资源的同步控制,如:
public class IntrinsicLockClass {
private Object a = new Object();
private Object b = new Object();
private synchronized void methodA1() {
//do methodA1 with a
}
private synchronized void methodA2() {
//do methodA2 with a
}
private synchronized void methodB1() {
//do methodB1 with b
}
private synchronized void methodB2() {
//do methodB2 with b
}
}
但这种方式有一个明显的缺陷,方法上的synchronized
关键字是绝对互斥的,即同一时间只有一个线程能访问该对象资源,但很多时候并不需要这种绝对的单线程互斥,我们希望不同种类的资源内部互斥就OK,不同种类资源之间不需要互斥,如上例中调用a
资源相关操作时b
相关操作亦处于阻塞状态,而这种阻塞是没必要的;此时monitor
即可派上用场
代码示例
继续上一节的例子,来看看monitor如何细粒度的控制资源同步操作:
public class MonitorClass {
private Object a = new Object();
private Object b = new Object();
private final Object lockA = new Object();
private final Object lockB = new Object();
private void methodA1() {
synchronized (lockA) {
//do methodA1 with a
}
}
private void methodA2() {
synchronized (lockA) {
//do methodA2 with a
}
}
private void methodB1() {
synchronized (lockB) {
//do methodB1 with b
}
}
private void methodB2() {
synchronized (lockB) {
//do methodB2 with b
}
}
}
在这段代码里,a
资源与b
类资源分别使用不同的锁进行资源访问互斥控制,解决了特定种类资源被操作时,整个对象处于阻塞状态的问题