java synchronized vs c# lock