[Sword refers to Offer learning] [interview question 2: Singleton mode-seven implementation methods], offersingleton
Question: To design a class, we can only generate one instance of this class.
Public class Test02 {/*** Singleton mode, lazy, thread safety */public static class Singleton {private final static Singleton INSTANCE = new Singleton (); private Singleton () {} public static Singleton getInstance () {return INSTANCE ;}}/*** Singleton mode, hunger style, thread unsafe */public static class Singleton2 {private static Singleton2 instance = null; private Singleton2 () {} public static Singleton2 getInstance () {if (instance = null) {instance = new Singleton2 ();} return instance ;}}/*** Singleton2 () Singleton2 () Singleton2 (empty Chinese) mode, thread security, inefficient in multi-threaded environments */public static class Singleton3 {private static Singleton3 instance = null; private Singleton3 () {} public static synchronized Singleton3 getInstance () {if (instance = null) {instance = new Singleton3 ();} return instance ;}/ *** Singleton3 mode, lazy, variant, thread security */public static class Singleton4 {private static Singleton4 instance = null; static {instance = new Singleton4 ();} private Singleton4 () {} public static Singleton4 getInstance () {return instance ;}}/*** Singleton mode, which uses static internal classes, thread security [recommended] */public static class Singleton5 {private final static class SingletonHolder {private static final Singleton5 INSTANCE = new Singleton5 ();} private Singleton5 () {} public static Singleton5 getInstance () {return SingletonHolder. INSTANCE;}/*** static internal class, which uses enumeration mode and thread security [recommended] */public enum Singleton6 {INSTANCE; public void whateverMethod () {}/*** static internal class, use double check lock, thread security [recommended] */public static class Singleton7 {private volatile static Singleton7 instance = null; private Singleton7 () {} public static Singleton7 getInstance () {if (instance = null) {synchronized (Singleton7.class) {if (instance = null) {instance = new Singleton7 ();}}} return instance ;}} public static void main (String [] args) {System. out. println (Singleton. getInstance () = Singleton. getInstance (); System. out. println (Singleton2.getInstance () = Singleton2.getInstance (); System. out. println (Singleton3.getInstance () = Singleton3.getInstance (); System. out. println (Singleton4.getInstance () = Singleton4.getInstance (); System. out. println (Singleton5.getInstance () = Singleton5.getInstance (); System. out. println (Singleton6.INSTANCE = Singleton6.INSTANCE); System. out. println (Singleton7.getInstance () = Singleton7.getInstance ());}}
Running result: