这个问题不是关于 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 太聪明并在我取消引用之前收集我的对象(也许允许编译器重用堆栈变量,但允许编译器对堆变量做这些事情,忽略获取围栏和加载围栏?),我最终得到损坏的数据。
编辑
似乎需要一个所谓的“可达性围栏”来防止优化器向上移动对象的最后一个引用。不幸的是,它不在哪里。