Java Thread.suspend精确语义

Java Thread.suspend精确语义,java,suspend,barrier,Java,Suspend,Barrier,这个问题不是关于Thread.suspend的替代方案。 这是关于用Thread.suspend实现一个偏差锁的可能性,我相信这不能用Thread.interrupt或类似的替代方法实现 我知道Thread.suspend已被弃用 但是我想知道Thread.suspend的精确语义 如果调用thread1.suspend(),是否保证在thread1完全停止之前阻止我?如果我调用thread1.resume(),那么这个调用是否对其他无序的线程可见 此外,如果我成功地挂起一个线程,这个线程会在某

这个问题不是关于Thread.suspend的替代方案。 这是关于用Thread.suspend实现一个偏差锁的可能性,我相信这不能用Thread.interrupt或类似的替代方法实现

我知道Thread.suspend已被弃用

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

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

此外,如果我成功地挂起一个线程,这个线程会在某种程度上安全地挂起吗?我会看到它的中间状态(因为Java禁止在没有正确同步的程序中使用空值,我认为这是不允许的)还是看到一些不正常的情况(如果挂起是一个异步请求,那么我肯定会看到这种情况)

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

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

编辑

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

如果GC不精确,我可能会以死锁告终。如果GC太聪明,在我取消引用之前收集我的对象(可能允许编译器重用堆栈变量,但允许编译器对堆变量执行此类操作,忽略获取围栏和加载围栏?),我最终会得到损坏的数据

编辑


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

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

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

如果线程处于活动状态,则它将被挂起,并且在恢复之前不会再继续进行


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

我不知道
Thread.suspend()
,但由于调试器接口的挂起功能仅在安全点停止,因此我在这里也会怀疑这一点。是的,我知道当遇到断点时,线程将处于安全点。但是挂起调用是同步的吗?我知道它不推荐了。我知道它不推荐了。我不认为它的语义完全由Javadoc中指定的内容组成。这个方法的Javadoc是如此的不完整(也就是说,当它说“如果线程是活动的,那么它是挂起的”是什么意思?那些“活动的”和“挂起的”定义在哪里。它被弃用是因为它很容易以错误的方式使用(也就是说,它天生容易死锁),但是如果您总是在挂起后立即恢复,为什么它“天生容易死锁”?也许反对这种方法是合理的,但是doc确实是错误的。