public Object get() { Monitor.Enter(this); try { Object o = null; while ((o = tryGet()) == null) { try { Monitor.Wait(this); } catch (ThreadInterruptedException) { } } return o; } finally { Monitor.Exit(this); } }