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

线程互斥部分
EN

Stack Overflow用户
提问于 2011-07-01 06:49:38
回答 4查看 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

回答 4

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用户

发布于 2011-07-02 00:16:03

这是我的尝试。为每个线程提供一个票号的想法。线程是根据它们的票号顺序输入的。我不熟悉Java,所以请阅读我的评论:

代码语言:javascript
复制
 public class Test {
    public static final Object obj = new Object();
    unsigned int count = 0;  // unsigned global int
    unsigned int next  = 0;  // unsigned global int

    public void doSomething() {
       unsigned int my_number;  // my ticket number

       // the critical section is small. Just pick your ticket number. Guarantee FIFO
       synchronized (obj) { my_number = count ++; } 

       // busy waiting
       while (next != my_number);

       // mutual exclusion

       next++;  // only one thread will modify this global variable
    }
 }

此答案的缺点是忙碌的等待,这将消耗CPU时间。

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

https://stackoverflow.com/questions/6541957

复制
相关文章

相似问题

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