فکر کنم برای این هست که در شرط اول if(__me==null) اگر null نبود که خب این آبجکت وجود داره و سریع return کنه و منتظر بلاک synchronization نمونه.
اما اگر null بود خب منتظر میمونه _lock آزاد بشه و اونوقت وارد ساخت شی برای __me بشه. اما ممکنه از زمانی که __me نال بوده تا زمانی که _lock آزاد بشه این آبجکت __me ساخته شده باشه و چون singelton هست نباید آبجکت دیگه ای ساخته بشه. خب اگر نبود که میسازیم و بعد هم return میکنیم. همچنین از این نظر خیالمون راحته که داخل synchronization دیگه ممکن نیست پس از چک کردن null بودن __me یک thread دیگه وارد این محدوده بشه.
میتونست شرط بیرونی رو نذاره ولی همونطور که خودشون هم نوشتن به خاطر performance بالاتر انجام شده چون اگر شرط بیرونی نباشه با اینکه قرار نیست شی جدیدی ساخته باشه ولی اگر کسی قبلا _lock رو اشغال کرده باشه، الکی باید منتظر بمونیم.

البته این بدبینانه ترین حالت ممکنه رو در نظر گرفته و خود singelton به صورت پیش فرض این مسئله رو در نظر نمیگیرم، مگر اینکه برناممون multithread باشه و به این صورت نباشه که قبل از ساخت چند thread یک بار getInstance کرده باشیم. اگر قبل از ساخت چند thread یکبار از getInstance استفاده کنیم، بقیش حله.