в целом понятно что тут к чему. Только есть оговорки о особенностях применения синхронизации. Мне просто хотелось бы услышать мнение о достоинствах и недостатках их, что и в каких случаях лучше всего использовать. вот самый обычный способ... package com.journaldev.singleton; public class ThreadSafeSingleton { private static ThreadSafeSingleton instance; private ThreadSafeSingleton(){} public static synchronized ThreadSafeSingleton getInstance(){ if(instance == null){ instance = new ThreadSafeSingleton(); } return instance; } } способ ниже был описан на хабре, и на том же хабре писалось что он не работает(прилагалась статья на инглише, но я пока не силен в этом(), подскажет кто что тут не так? public static ThreadSafeSingleton getInstanceUsingDoubleLocking(){ if(instance == null){ synchronized (ThreadSafeSingleton.class) { if(instance == null){ instance = new ThreadSafeSingleton(); } } } return instance; } и вот тоже есть способ синхронизации через статический метод, в чем его плюс? где лучше использовать? public class Solution { public static class OurPresident { private static OurPresident president; static { synchronized (OurPresident.class) { president = new OurPresident(); } } private OurPresident() { } public static OurPresident getOurPresident() { return president; } } }