这个问题与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太聪明并且在我使引用无效之前收集我的对象(可能允许编译器重用堆栈变量,但编译器是否允许为堆变量执行这些操作,忽略获取fence和load fence?),我最终得到了损坏的数据。
修改
似乎需要一个所谓的“可达性围栏”来阻止优化器向上移动对象的最后一个引用。不幸的是,它不在哪里。
答案 0 :(得分:0)
它的语义完全由Javadoc中指定的内容组成:
暂停此帖子。 首先,调用此线程的checkAccess方法,不带参数。这可能导致抛出SecurityException(在当前线程中)。
如果线程处于活动状态,它将被暂停并且不会继续进行,除非并且直到它恢复。
但是,由于您不会使用它,因为它已被弃用,这一切都无关紧要。