简单易懂设计模式 之 管程(monitor)

管程 (英语: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类资源分别使用不同的锁进行资源访问互斥控制,解决了特定种类资源被操作时,整个对象处于阻塞状态的问题

你可能感兴趣的:(简单易懂设计模式 之 管程(monitor))