首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Thread.suspend精确语义

Java Thread.suspend精确语义
EN

Stack Overflow用户
提问于 2015-05-18 15:56:23
回答 1查看 120关注 0票数 1

这个问题与Thread.suspend的替代品无关。这是关于用Thread.suspend实现偏置锁的可能性,我相信这种锁不能用Thread.interrupt或类似的替代实现。

我知道Thread.suspend不受欢迎。

但是我想知道Thread.suspend的精确语义。

如果我调用线程1挂起(),是否保证在thread1完全停止之前我会被阻塞?如果我调用线程1恢复(),这个调用对其他线程是否是不可见的?

更重要的是,如果我成功地挂起了一个线程,这个线程会被挂在一个稍微安全的点上吗?我会看到它的中间状态(因为Java即使在不适当的同步程序中也禁止使用稀薄的空气值,我认为这是不允许的),还是看到一些不正常的东西(如果挂起是一个异步请求,那么我肯定会看到这样的事情)?

我想知道这些,因为我想在Java中实现一些玩具不对称锁(比如BiasedLock in HotSpot)。使用Thread.suspend,您可以在没有存储负载屏障的情况下实现类似锁的Dekker (并将负担转移到罕见的路径)。我的实验表明它可以工作,但是由于Thread.sleep足以等待远程上下文切换,所以我不确定这是有保证的行为。

顺便问一下,还有其他方法来强制(或探测)远程屏障吗?例如,我搜索web并发现其他人使用FlushProcessWriteBuffers或更改关联将线程绑定到每个核心。这些技巧能在Java中完成吗?

编辑

我想出了个主意。也许我可以使用GC和终结器来实现偏置锁,至少如果只有两个线程。不幸的是,慢路径可能需要显式的gc()调用,这实际上并不实用。

如果GC不精确,我可能会陷入僵局。如果GC太聪明,在我取消引用之前收集我的对象(可能允许编译器重用堆栈变量,但是编译器是否允许为堆变量做这类事情,而忽略了获取栅栏和加载栅栏?),我最终得到了损坏的数据。

编辑

似乎需要一个所谓的“可达性围栏”来防止优化器向上移动对象的最后一个引用。不幸的是它不在哪里。

EN

回答 1

Stack Overflow用户

发布于 2015-05-19 10:07:50

它的语义完全由Javadoc中指定的内容组成:

挂起这个线程。首先,调用该线程的checkAccess方法时不带任何参数。这可能导致抛出一个SecurityException (在当前线程中)。 如果线程是活动的,那么它将被挂起,除非和直到恢复,否则不会取得进一步的进展。

但由于你不打算使用它,因为它被废弃了,这一切都是无关紧要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30307793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档