The equivalent functionality (including the normal locking) is in the Monitor class.
java => C#
foo.notify() => Monitor.Pulse(foo)
foo.notifyAll() => Monitor.PulseAll(foo)
foo.wait() => Monitor.Wait(foo)
The lock
statement in C# is equivalent to calling Monitor.Enter and Monitor.Exit with an appropriate try/finally block.
See my threading tutorial or Joe Albahari's one for more details.
http://stackoverflow.com/questions/209281/c-sharp-equivalent-to-javas-wait-and-notify