不安全的sun类实现 /** *如果Java变量当前为 *等待。 *@如果成功返回true */ 公共最终本机布尔比较AndSwapObject(对象o,长偏移, 预期的对象, 对象x);
1) 如果“值==预期值”,他们如何“原子地”将位置“偏移”处的“o”值设置为“x” 2) 当我们使用同步方法或同步块时,它们如何“锁定”对象?我只是想知道引擎盖下面是什么不安全的sun类实现 /** *如果Java变量当前为 *等待。 *@如果成功返回true */ 公共最终本机布尔比较AndSwapObject(对象o,长偏移, 预期的对象, 对象x);,java,virtual-machine,Java,Virtual Machine,1) 如果“值==预期值”,他们如何“原子地”将位置“偏移”处的“o”值设置为“x” 2) 当我们使用同步方法或同步块时,它们如何“锁定”对象?我只是想知道引擎盖下面是什么 因为这是本机方法,所以他们将退回到目标平台提供的任何方法。十多年前,IIRC“比较和交换”作为处理器命令出现在MIPS和SPARC上 他们在幕后使用类似于1的东西来锁定对象 您的问题的确切答案取决于实现 有关原子包文档,请参见此处: 实现通常使用机器级原子指令,如比较和交换。是的,compareAndSwapObject调用
您的问题的确切答案取决于实现 有关原子包文档,请参见此处:
实现通常使用机器级原子指令,如比较和交换。是的,
compareAndSwapObject
调用转换为本机方法调用或使用本机硬件设施进行比较和交换的内联扩展
至于
synchronized
关键字的实现,可以使用任意数量的技术,但它们在概念上都类似于比较和交换。您可能需要看看Intel为其x86处理器系列提供了什么
我想你需要一本教科书。@TomHawtin tackline你能给我一本/任何教科书的名称吗?事实上,我怀疑是否有一本教科书能准确/深刻地涵盖这个主题。这是你在街上捡到的东西。这个操作的全部要点是它没有锁,线程安全的保证是由CPU硬件提供的。如果你足够好奇,你可以下载OpenJDK源代码,看看它是如何完成的。
/**
* Atomically update Java variable to <tt>x</tt> if it is currently
* holding <tt>expected</tt>.
* @return <tt>true</tt> if successful
*/
public final native boolean compareAndSwapObject(Object o, long offset,
Object expected,
Object x);