线程互斥部分

Dan*_*iel 16 java concurrency multithreading

您好,我刚刚接受电话采访我无法回答这个问题,我想知道答案,我相信,建议找到您不知道的答案.请鼓励我理解这个概念.

他的问题是:

"synchronized块只允许一个线程一次进入互斥段.当一个线程退出synchronized块时,synchronized块没有指定哪个等待线程接下来会进入互斥段?使用synchronized和方法在Object中,你能实现先到先得的互斥部分吗?保证线程按到达顺序进入互斥部分?

 public class Test {
   public static final Object obj = new Object();

   public void doSomething() {
     synchronized (obj) {
          // mutual exclusive section
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

jta*_*orn 8

这是一个简单的例子:

public class FairLock {
    private int _nextNumber;
    private int _curNumber;

    public synchronized void lock() throws InterruptedException {
        int myNumber = _nextNumber++;
        while(myNumber != _curNumber) {
            wait();
        }
    }

    public synchronized void unlock() {
        _curNumber++;
        notifyAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

你会像以下一样使用它:

public class Example {
  private final FairLock _lock = new FairLock();

  public void doSomething() {
    _lock.lock();
    try {
      // do something mutually exclusive here ...
    } finally {
      _lock.unlock();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(注意,这不能处理lock()调用者收到中断异常的情况!)


And*_*ich 1

您可以使用ReentrantLock并将公平参数设置为 true。那么下一个服务的线程将是等待时间最长的线程,即第一个到达的线程。