public virtual void Test() { Assert.AreEqual(0, l.GetAndAdd(2)); Assert.AreEqual(2, l.Get()); l.Set(5); Assert.AreEqual(5, l.Get()); Assert.AreEqual(8, l.AddAndGet(3)); Assert.IsFalse(l.CompareAndSet(7, 4)); Assert.AreEqual(8, l.Get()); Assert.IsTrue(l.CompareAndSet(8, 4)); Assert.AreEqual(4, l.Get()); Assert.AreEqual(3, l.DecrementAndGet()); Assert.AreEqual(3, l.GetAndIncrement()); Assert.AreEqual(4, l.GetAndSet(9)); Assert.AreEqual(10, l.IncrementAndGet()); }
public virtual bool Init(long id) { if (id <= 0) { return(false); } var step = (id / BlockSize); lock (this) { var init = _atomicLong.CompareAndSet(0, step + 1); if (init) { _local.Set(step); _residue.Set((int)(id % BlockSize) + 1); } return(init); } }