我如何有条件地锁定Java?

Jon*_*Jon 1 java locking synchronized

我一直在利用Java的synchronized块来使代码线程的一部分安全.我正在将数据结构移植到通常可以使用synchronized块的java ,但我并不总是知道如何以典型的Java方式使用它们.

以下是一个场景的示例:

myMethod (Bool useLock)
    {
    if (useLock)
        {
        //locks the following section of code until unlocked.
        lockObject.lock();
        }

     //do more stuff....

    if (useLock)
        {
        //unlocks exclusive control of code.
        lockObject.unlock();
        }
     }
Run Code Online (Sandbox Code Playgroud)

我如何在Java中完成相同的操作?在这段代码中,有时我想要锁定,有时我不想,但我想要聪明一点,而不必编写相同代码的两个版本.除了使用synchronized块之外,还有其他方法可以锁定Java 吗?

Jir*_*ser 5

你可以使用Lock对象,特别是ReentrantLock应该做的工作.http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

或者你仍然可以解决synchronized块的问题.您问题的代码如下所示:

myMethod (Bool useLock) {
    if (useLock) {
        synchronized (this) {
           criticalSection();
        }
    } else {
        criticalSection();
    }
}

criticalSection() {
   //do more stuff....
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要保证类的不同实例之间的互斥,则应使用其他监视器对象this.例如TheClassName.class,该类的其他显式定义的静态变量.