4

我知道 LockSupport 是 JDK 的一部分,但我想知道下面的实现在语义上是否正确。观察 Object.wait 可以处理线程中断的问题。我的问题与性能无关。但是,只要您的解决方案仅使用基本结构,如等待、通知和同步,我将不胜感激任何改进我的解决方案的建议。

非常感谢。

final class LockSupport {
    static void park(long time) {
        Thread th = Thread.currentThread();
        if (th instanceof MyThread) {
            MyThread h = (MyThread)th;
            synchronized (h.obj) {
                if (h.permit) {
                    h.permit = false;
                    return;
                }
                try {
                    h.obj.wait(time);
                } catch (InterruptedException e) { }
            }
        }
    }

    static void unpark(MyThread h) {
        synchronized (h.obj) {
            h.permit = true;
            h.obj.notify();
        }
    }
}

abstract class MyThread extends Thread {
    public Object obj = new Object();
    public boolean permit = true;
}
4

1 回答 1

2

初始许可应该是假的。

当捕获到中断时,需要重新中断当前线程

 catch (InterruptedException e) { th.interrupt(); }

因为如果park()由于中断返回,应该设置中断状态(参见javadoc示例)

完成wait()后,通常或因中断而突然消耗许可证。

unpark()中,如果 permit 已经为真,则无需通知。

于 2013-02-27T23:13:31.827 回答