As far as you're touching the data from different threads, you have to synchronize the access. The simplest way is lock() instruction, and it should be placed at both Read() and Write() methods.
Obviously, Write() should has lock() to avoid concurrent submit into the same memory cell (because the buffer is accumulating the data from every writer, not "winner" only).
Read() should have lock() as well because it
- modifies same internal members as Write() does
- can be affected by compiler optimization as well as run-time instruction re-ordering (because computational effect is the same, but inter-thread interaction may be ruined)
P.S. At advanced level, you may use one-way memory barriers instead of unidirectional locks, but this requires a lot of experience