Java AtomicBoolean 在 dotNET 上的实现(In Dotnet Implement)

    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]

                    lock mov dword ptr[location], eax

                }

             }

猜你喜欢

转载自blog.csdn.net/liulilittle/article/details/80881401