"Nuclear Reactor Insufficient Granularity"

public static class ReactorEventDispatcher {
	private static readonly object eventDispatcherSyncObj = new object();

	private static event Action startingUp;
	private static event Action heatCritical;
	private static event Action safetyShutdown;

	public static event Action StartingUp {
		add {
			lock (eventDispatcherSyncObj) {
				startingUp += value;
			}
		}
		remove {
			lock (eventDispatcherSyncObj) {
				startingUp -= value;
			}
		}
	}

	public static event Action HeatCritical {
		add {
			lock (eventDispatcherSyncObj) {
				heatCritical += value;
			}
		}
		remove {
			lock (eventDispatcherSyncObj) {
				heatCritical -= value;
			}
		}
	}

	public static event Action SafetyShutdown {
		add {
			lock (eventDispatcherSyncObj) {
				safetyShutdown += value;
			}
		}
		remove {
			lock (eventDispatcherSyncObj) {
				safetyShutdown -= value;
			}
		}
	}

	internal static void TriggerStartUp() {
		lock (eventDispatcherSyncObj) {
			if (startingUp != null) startingUp();
		}
	}

	internal static void TriggerHeatCritical() {
		lock (eventDispatcherSyncObj) {
			if (heatCritical != null) heatCritical();
		}
	}

	internal static void TriggerSafetyShutdown() {
		lock (eventDispatcherSyncObj) {
			if (safetyShutdown != null) safetyShutdown();
		}
	}
}


Code snippet taken from "Common Multithreading Mistakes in C# - I: Incorrect Granularity".