【问题标题】:mutually exclusive java method execution (not all)互斥的java方法执行(不是全部)
【发布时间】:2016-01-31 12:54:09
【问题描述】:

我有一个带有 4 个方法的 java 类:

public void method_A() {   ...   }

public void method_B1() {   ...   }

public void method_B2() {   ...   }

public void method_B3() {   ...   }

这个类的实例被许多对调用方法 B1 B2 和 B3 感兴趣的多线程使用。让它们同时执行绝对没问题

但是,有时会在内部调用 method_A() ,而此时永远不应该调用其他 3 个。当 method_A() 运行时,不应该运行其他方法,它们应该使用某种锁等待直到 method_A() 完成。

真的不确定如何转化为代码。非常感谢

【问题讨论】:

    标签: java concurrency thread-safety locking


    【解决方案1】:

    这是ReentrantReadWriteLock 的好案例。它允许同时读取(B1B2B3),但写入(A)会阻止读取和写入。

    你应该添加:

    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    

    B* 方法中:

    lock.readLock().lock();
    try {        
        // method code
    } finally {
        lock.readLock().unlock();
    }
    

    A:

    lock.writeLock().lock();
    try {
        // method code
    } finally {
        lock.writeLock().unlock();
    }
    

    【讨论】:

    • 谢谢!并且假设,methodB*() 是否能够调用 methodA()? (没有其他方法 B*() 能够在 A 进行时运行)
    • 不幸的是,您不能自动将锁从读升级为写 - 您必须首先释放读锁(这可能允许其他线程干预)。有upgradable lock的实现@
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多