public class Money { private long m_val; public Money(long val) { m_val = val; } public long Value { get { return m_val; } } public void AddToMoney(long val) { Interlocked.Add(ref m_val, val); } public bool CheckAndDeduct(long removeAmt) { long exch; long cmp, newcmp = Interlocked.Read(ref m_val); do { if (Interlocked.Read(ref m_val) < removeAmt) { return false; } cmp = newcmp; exch = m_val - removeAmt; } while ((newcmp = Interlocked.CompareExchange(ref m_val, exch, cmp)) != cmp); return true; } }