Java 运行时提供了一些“不同类型的原子变量”封装,今天我们着重点在“AtomicBoolean”,它是 Java 实现 TTASLock 锁的核心。
本文给出C#语言的实现,与 Java 的实现是类似的。(注明:本人不会 Java,更非 Javaer,只是某些事物的爱好者)
public class AtomicBoolean
{
private volatile int s = 0x00;
public AtomicBoolean(bool initialValue)
{
this.s = initialValue ? 1 : 0;
}
public bool Get() => Interlocked.CompareExchange(ref s, 0, 0) != 0x00;
public void Set(int value) => Interlocked.Exchange(ref s, value);
public bool CompareAndSet(bool expect, bool update) => Interlocked.CompareExchange(ref s, update ? 1 : 0, expect ? 1 : 0) != 0x00;
}
一般来说”AtomaicBoolean“的原子变量,以实用前提的话,只需要向外提供三个接口就可以了,即”get、set、compareAndSet“,多了没有太大的意义。
AtomicBoolean a = new AtomicBoolean(false);
bool n = a.CompareAndSet(false, true);
但就实现角度来说,并不难,仅仅只是需要两个”原子改变“、”原子比较改变“类型的函数就可以了,例:原子改变在x86中的实现,就比较简单,两条指令搞定问题!
例:
static void __interlocked_exchange(volatile int* location, int value) {
_asm {
mov eax, dword ptr[value]
扫描二维码关注公众号,回复:
2752162 查看本文章
lock mov dword ptr[location], eax
}
}