java同步访问不同的关键部分

时间:2016-10-16 06:49:46

标签: java multithreading locking mutex critical-section

我的方法如下所示。

public int smallest(int num1, int num2, int num3){
    if (num1 < num2){
        if (num1 < num3 ){
            return num1;
        }
    }
    if (num2 < num1){
        if (num2 < num3){
            return num2;
        }
    }
    if (num3 < num1){
        if (num3 < num2){
            return num3;
        }
    }
    else 
        return num1;
}

我需要限制对这些方法的访问,以便

  1. 当一个线程访问criticalMethod()时,应该限制对所有其他线程的method1()和method2()的访问。同样,当一个线程访问method1()和method2()时,访问criticalMethod( )应限制所有其他线程。
  2. method1()可以由不同的线程同时访问。
  3. method2()可以由不同的线程单独访问。
  4. method1()和method2()可以由不同的线程同时访问。
  5. 为了满足第一次访问条件,我提出了以下代码, 但是这不会满足其他3个条件,因此性能会受到影响。

    public class CriticalSections
    {
    
        public void mainMethod(boolean b)
            {
                if (b) {
                    method1();
                }
                else {
                    criticalMethod();
                    method2();
                }
            }
    
    
            private void criticalMethod()
            {
                System.out.println("in criticalMethod");
            }
    
            private void method1()
            {
                System.out.println("in method1");
            }
    
            private void method2()
            {
                System.out.println("in method2");
            }
     }
    

    用于满足上述场景的同步机制应该是什么?

1 个答案:

答案 0 :(得分:3)

您需要的是display: block;上的独占锁定以及方法criticalMethodmethod1上的可共享锁定。实现此目的的最简单方法是使用method2,如下所示:

java.util.concurrent.locks.ReentrantReadWriteLock

如果您担心性能问题,您还可以take a look at public class CriticalSections { private final ReadWriteLock lock = new ReentrantReadWriteLock(); public void mainMethod(boolean b) { if (b) { method1(); } else { criticalMethod(); method2(); } } private void criticalMethod() { Lock writeLock = lock.writeLock(); writeLock.lock(); try { System.out.println("in criticalMethod"); } finally { writeLock.unlock(); } } private void method1() { Lock readLock = lock.readLock(); readLock.lock(); try { System.out.println("in method1"); } finally { readLock.unlock(); } } private void method2() { Lock readLock = lock.readLock(); readLock.lock(); try { System.out.println("in method2"); } finally { readLock.unlock(); } } } (Java 8 +)。