我们怎样才能确保在任何时候只有一种静态方法&一个类的非静态方法被调用?

时间:2016-05-14 06:46:59

标签: java multithreading synchronization thread-safety

给定一个具有静态方法的类&非静态实例方法, 您如何确保在任何时间点只调用其中一种方法?

实施例: ------

public class DoMath{


public static int getSum(){
//Sum
}

public int getSub(){
//Subtract
}

}

现在你需要确保在任何一个时间点只调用这些方法中的任何一个。

2 个答案:

答案 0 :(得分:1)

这应该这样做。

public class DoMath{
    public static synchronized int getSum(){
        //Sum
    }

    public int getSub(){
        synchronized(DoMath.class) {
            //Subtract
        }
    }
}

说明:static synchronized方法隐式地同步声明该方法的类的Class对象。

答案 1 :(得分:1)

最佳做法是使用私人锁扣。这可以防止您的代码在类外部锁定。这在以下示例中进行了演示。请注意输出中的执行顺序 - DoMathExposed#getSum()在释放可公开访问的类监视器之前无法返回。另一方面,DoMathEncapsulated#getSum()会立即返回,因为它在私有对象上同步,因此保持公共类监视器无效。

resources :posts