c# lock vs java synchronized