Java线程.暂停精确的语义



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

我知道线程。不支持挂起

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

如果我调用thread1.suspend(),我保证被阻塞直到thread1完全停止吗?如果我调用thread1.resume(),这个调用可以对其他线程无序可见吗?

更重要的是,如果我成功挂起一个线程,这个线程会挂在一个安全的点吗?我将看到它的中间状态(因为Java禁止凭空出现的值,即使在没有正确同步的程序中,我不相信这是允许的)或看到一些无序的东西(如果suspend是一个异步请求,那么我肯定会看到那种东西)?

我想知道这些,因为我想在Java中实现一些玩具非对称锁(如热点中的BiasedLock)。使用线程。你可以实现一个Dekker一样的锁,没有存储负载障碍(并将负担转移到稀有路径)。我的实验表明它是有效的,但自从一个线程。sleep足以等待远程上下文切换,我不确定这是有保证的行为。

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

编辑

我想到了一个主意。也许我可以使用GC和终结器来实现有偏锁,至少在只有两个线程的情况下是这样。不幸的是,缓慢的路径可能需要显式的gc()调用,这是不实际的。

如果GC不精确,我可能会以死锁结束。如果GC太聪明,在我取消引用之前收集我的对象(也许允许编译器重用堆栈变量,但是编译器是否允许对堆变量做这些事情,忽略获取围栏和加载围栏?)

编辑

似乎需要一个所谓的"可达性栅栏"来防止优化器向上移动对象的最后一个引用。

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

挂起这个线程。首先,调用该线程的checkAccess方法时不带参数。这可能导致抛出SecurityException(在当前线程中)。

如果线程是活的,它被挂起,除非它被恢复,否则不会再进行任何操作。

但是由于你不打算使用它,因为它已经被弃用了,所以这些都是无关紧要的

最新更新