这个问题与Thread.suspend的替代方法无关。
这是关于用Thread.suspend实现偏向锁的可能性,(我认为)不能用Thread.interrupt或类似的替代方法来实现。
我知道Thread.suspend已过时。
但是我想知道Thread.suspend的确切语义。
如果我调用thread1.suspend(),是否可以确保线程1完全停止之前被阻止?如果我调用thread1.resume(),此调用是否对其他线程可见?
此外,如果我成功地挂起了线程,该线程是否会在某个安全点被挂起?我会看到它的中间状态(因为Java即使在未正确同步的程序中也禁止凭空获取值,我认为这是不允许的)还是会看到一些异常(如果suspend是异步请求,那么确保我会看到)这种事情)?
我想知道这些,因为我想在Java中实现一些玩具非对称锁(例如HotSpot中的BiasedLock)。使用Thread.suspend可以实现类似Dekker的锁,而无需存储负载屏障(并将负担转移到稀有路径)。我的实验表明它可以正常工作,但是由于Thread.sleep足以等待远程上下文切换,因此我不确定这是否可以保证。
顺便说一句,还有其他方法可以强制(或检测)远程障碍吗?例如,我在网上搜索并发现其他人使用FlushProcessWriteBuffers或更改亲和力以将线程绑定到每个核心。这些技巧可以在Java中完成吗?
编辑
我想到了一个主意。也许至少在只有两个线程的情况下,我才能使用GC和finalizer实现有偏锁。不幸的是,缓慢的路径可能需要显式的gc()调用,这实际上并不实用。
如果GC不精确,我可能会陷入僵局。如果GC太聪明了并且在我取消引用之前收集了我的对象(也许允许编译器重用堆栈变量,但是允许编译器对堆变量执行此类操作,而忽略获取围栏和加载围栏吗?),我最终遭到损坏的数据。
编辑
似乎需要一个所谓的“可到达性围栏”来防止优化器向上移动对象的最后一个引用。不幸的是,这没有地方。
最佳答案
它的语义完全由Javadoc中指定的内容组成:
挂起该线程。
首先,不带参数调用此线程的checkAccess方法。这可能导致抛出SecurityException(在当前线程中)。
如果线程处于活动状态,则将其挂起,并且除非继续进行操作,否则它将不会进一步进行。
但是,由于您已不再使用它,因为它已被弃用,所以这一切都无关紧要。