"Reference Leak Example"

class ExampleClass {
	List<SomeDataType> someData = new List<SomeDataType>();
	readonly object dataLock = new object();
	
	public List<SomeDataType> SomeData {
		get {
			lock (dataLock) {
				return someData;
			}
		}
	}
	
	public void ProcessData() {
		lock (dataLock) {
			foreach (var data in somedata) data.Process();
		}
	}
	
	public void AddData(List<SomeDataType> newData) {
		lock (dataLock) {
			someData.AddRange(newData);
		}
	}
	
	public void SetData(List<SomeDataType> newData) {
		lock (dataLock) {
			someData = newData;
		}
	}
}


Code snippet taken from "Common Multithreading Mistakes in C# - IV: Everything Else".