你好,我刚刚接受了电话面试,我不能回答这个问题,我想知道答案,我相信,最好去寻找你不知道的答案。请鼓励我理解这个概念。
他的问题是:
“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-02 00:50:39
下面是一个简单的例子:
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();
}
}
public class Example {
private final FairLock _lock = new FairLock();
public void doSomething() {
_lock.lock();
try {
// do something mutually exclusive here ...
} finally {
_lock.unlock();
}
}
}
(注意,这不能处理lock()的调用者收到中断异常的情况!)
发布于 2011-07-01 06:57:28
他们所要求的是一个公平的互斥锁
创建锁对象的FIFO队列,这些锁对象是由等待锁的线程推入的,然后等待锁(除了在单独锁上的同步块中等待之外)
然后,当锁被释放时,一个对象从队列中弹出,等待它的线程被唤醒(也在同一锁上同步以添加对象)
发布于 2011-07-01 06:55:21
可以在公平性参数设置为true的情况下使用ReentrantLock。那么下一个被服务的线程将是等待时间最长的线程,也就是最先到达的线程。
https://stackoverflow.com/questions/6541957
复制相似问题