1

这个问题不是关于 Thread.suspend 的替代品。这是关于使用 Thread.suspend 实现偏置锁的可能性,(我相信)不能使用 Thread.interrupt 或类似的替代方案来实现。

我知道 Thread.suspend 已被弃用。

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

如果我调用 thread1.suspend(),我是否保证在 thread1 完全停止之前被阻塞?如果我调用thread1.resume(),这个调用对其他线程是否可见?

此外,如果我成功挂起一个线程,该线程是否会在某个安全点被挂起?我会看到它的中间状态(因为即使在未正确同步的程序中,Java 也会无中生有地禁止值,我不相信这是允许的)还是看到一些乱序(如果挂起是异步请求,那么我肯定会看到那种东西)?

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

顺便问一下,有没有其他方法可以强制(或检测)远程屏障?例如,我在网上搜索并发现其他人使用 FlushProcessWriteBuffers 或更改亲和力来将线程绑定到每个内核。这些技巧可以在 Java 中完成吗?

编辑

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

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

编辑

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

4

1 回答 1

0

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

暂停此线程。首先,调用该线程的 checkAccess 方法时不带任何参数。这可能会导致抛出 SecurityException(在当前线程中)。

如果线程是活动的,它会被挂起并且不会继续前进,除非它被恢复。

但是由于您不打算使用它,因为它已被弃用,所以这一切都无关紧要。

于 2015-05-19T10:07:50.213 回答