首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >线程互斥部分

线程互斥部分
EN

Stack Overflow用户
提问于 2011-07-01 06:49:38
回答 5查看 4.2K关注 0票数 16

你好,我刚刚接受了电话面试,我不能回答这个问题,我想知道答案,我相信,最好去寻找你不知道的答案。请鼓励我理解这个概念。

他的问题是:

“synchronized块一次只允许一个线程进入互斥部分。当线程退出synchronized块时,synchronized块不指定下一个允许哪个等待线程进入互斥部分?使用Object中的synchronized和方法,你能实现先来先服务的互斥部分吗?保证线程按到达顺序进入互斥部分?”

代码语言:javascript
复制
 public class Test {
   public static final Object obj = new Object();

   public void doSomething() {
     synchronized (obj) {
          // mutual exclusive section
     }
   }
 }
EN

回答 5

Stack Overflow用户

发布于 2011-07-02 00:50:39

下面是一个简单的例子:

代码语言:javascript
复制
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();
    }
}

代码语言:javascript
复制
public class Example {
  private final FairLock _lock = new FairLock();

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

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

票数 8
EN

Stack Overflow用户

发布于 2011-07-01 06:57:28

他们所要求的是一个公平的互斥锁

创建锁对象的FIFO队列,这些锁对象是由等待锁的线程推入的,然后等待锁(除了在单独锁上的同步块中等待之外)

然后,当锁被释放时,一个对象从队列中弹出,等待它的线程被唤醒(也在同一锁上同步以添加对象)

票数 3
EN

Stack Overflow用户

发布于 2011-07-01 06:55:21

可以在公平性参数设置为true的情况下使用ReentrantLock。那么下一个被服务的线程将是等待时间最长的线程,也就是最先到达的线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6541957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档