为了账号安全,请及时绑定邮箱和手机立即绑定

锁存不同的任务类型

锁存不同的任务类型

喵喵时光机 2021-04-05 16:40:20
我正在寻找以下问题的Java并发解决方案。有一些任务正在运行,还有一段代码C。C必须等待所有任务完成。(超时)在C完成之前,无法开始任何任务。我浏览了java.concurrency包,发现了一些有趣的东西,但是似乎没有什么工作很正确:移相器将允许一种方式阻塞,但不允许两种方式。信号量,ForkJoinTasks和其他具有计数器类型的功能,但似乎都没有我想要的功能。我相信我可以使用移相器和锁来构造一些东西,如下所示:void C() {    synchronized(lock) {        phaser.awaitAdvanceInterruptibly(phase, 1, TimeUnit.SECONDS);        // Start work anyway if a task is taking too long.        doWork();    }}void someTask() {    synchronized(lock) {        phaser.register();    }    doTask().thenRun(        () -> phaser.arriveAndDeregister()    );}现在,尽管我相当确定这是可行的,但我也知道尝试构建自己的并发解决方案是一个坏主意。有更好的方法吗?如果没有,我将如何使用该phase参数?编辑:此问题是在涉及Web客户端连接的项目中,因此任务无法预测地到达。但是,通过更仔细的设计可以避免这种情况。
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我在java.util.concurrent.locks中找到了解决此问题的解决方案,这对我的用例来说是完美的。


StampedLock lock;


void C() {

    long stamp = lock.tryWriteLock(1, TimeUnit.SECONDS);

    doWork();

    lock.unlockWrite(stamp);

}


void someTask() {

    long stamp = lock.readLock();

    doTask().thenRun(() -> lock.unlockRead(stamp));

}

StampedLock类的关键是readLock()不是互斥的,而writeLock()是互斥的。它也支持超时,类似于常规的Lock。


查看完整回答
反对 回复 2021-04-28
  • 2 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信