你好,我刚刚接受了电话面试,我不能回答这个问题,我想知道答案,我相信,最好去寻找你不知道的答案。请鼓励我理解这个概念。
他的问题是:
“synchronized块一次只允许一个线程进入互斥部分。当线程退出synchronized块时,synchronized块不指定下一个允许哪个等待线程进入互斥部分?使用Object中的synchronized和方法,你能实现先来先服务的互斥部分吗?保证线程按到达顺序进入互斥部分?”
public class Test {
public static final Object obj = new Object();
public void doSomething() {
synchronized (obj) {
// mutual exclusive section
}
}
}
发布于 2011-07-01 06:57:28
他们所要求的是一个公平的互斥锁
创建锁对象的FIFO队列,这些锁对象是由等待锁的线程推入的,然后等待锁(除了在单独锁上的同步块中等待之外)
然后,当锁被释放时,一个对象从队列中弹出,等待它的线程被唤醒(也在同一锁上同步以添加对象)
发布于 2011-07-01 06:55:21
可以在公平性参数设置为true的情况下使用ReentrantLock。那么下一个被服务的线程将是等待时间最长的线程,也就是最先到达的线程。
发布于 2011-07-02 00:16:03
这是我的尝试。为每个线程提供一个票号的想法。线程是根据它们的票号顺序输入的。我不熟悉Java,所以请阅读我的评论:
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时间。
https://stackoverflow.com/questions/6541957
复制相似问题