ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

我可以在纯Java中实现park / unpark方法吗?

2019-07-03 22:47:30  阅读:125  来源: 互联网

标签:java jvm synchronization concurrent-programming


我知道LockSupport是JDK的一部分,但我想知道下面的实现是否在语义上是正确的.注意到Object.wait可以处理线程中断的问题.我的问题不在于绩效;但是,只要您的解决方案仅使用基本构造(如wait,notify和synchronized),我将不胜感激任何改进我的解决方案的建议.

非常感谢.

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;
}

解决方法:

初始许可证应该是假的.

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

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

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

wait()完成后,由于中断正常或突然,消耗许可证.

在unpark()中,如果许可已经存在,则无需通知.

标签:java,jvm,synchronization,concurrent-programming
来源: https://codeday.me/bug/20190703/1371225.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有