java设计模式-单例模式

package 单例模式;

/*
 * 饿汉式
 * 类加载到内存后 就实例化一个单例 JVM保证了线程安全
 * 
 * 唯一缺点: 不管有用到与否 类加载时就完成实例化
 * (话说你不用的 你装载它干嘛) -> 懒加载方式
 */
public class Mgr01 {
	private Mgr01(){}
	
	private static final Mgr01 instance = new Mgr01();
	
	public static Mgr01 getInstance()
	{
		return instance;
	}
	
	public void m() {System.out.println("m");}
	
	public static void main(String[] args) {
		Mgr01 mgr01 = Mgr01.getInstance();
		Mgr01 mgr02 = Mgr01.getInstance();
		System.out.println(mgr01 == mgr02);
	}
}
package 单例模式;

/*
 * 和Mgr01一样
 * =Mgr01
 */
public class Mgr02 {
	private Mgr02(){}
	
	private static final Mgr02 instance;
	static {
		instance = new Mgr02();
	}
	
	public static Mgr02 getInstance()
	{
		return instance;
	}
	
	public void m() {System.out.println("m");}
	
	public static void main(String[] args) {
		Mgr01 mgr01 = Mgr01.getInstance();
		Mgr01 mgr02 = Mgr01.getInstance();
		System.out.println(mgr01 == mgr02);
	}
}

package 单例模式;

/*
 * lazy loading 
 * 
 * 懒汉式
 * 多线程访问会有影响
 * 
 */
public class Mgr03 {
  private  static Mgr03 instance;
  
  private Mgr03()
  {
	  
  }
  
  public static Mgr03 getInstance()
  {
	  if(instance  == null)
	  {
		  try {
			Thread.sleep(1);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		  instance = new Mgr03();
	  }
	  return instance;
  }
  
  public void m() {System.out.println("m");}
	
	public static void main(String[] args) {
		for(int i = 0 ; i < 100; i++)
		{
			new Thread(()->
			{
				System.out.println(Mgr03.getInstance().hashCode());
				
			}).start();
		}
	}
}

package 单例模式;

/*
 * 加锁 
 * 效率就会降低
 * 
 */
public class Mgr04 {
	  private  static Mgr04 instance;
	  
	  private Mgr04()
	  {
		  
	  }
	  
	  public static  synchronized Mgr04 getInstance()
	  {
		  if(instance  == null)
		  {
			  try {
				Thread.sleep(1);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			  instance = new Mgr04();
		  }
		  return instance;
	  }
	  
	  public void m() {System.out.println("m");}
		
		public static void main(String[] args) {
			for(int i = 0 ; i < 100; i++)
			{
				new Thread(()->
				{
					System.out.println(Mgr04.getInstance().hashCode());
					
				}).start();
			}
		}
	}
package 单例模式;

/*
 * 
 * 
 */
public class Mgr05 {
	private static Mgr05 instance;

	private Mgr05() {

	}

	public static Mgr05 getInstance() {
		if (instance == null) {
			//妄想通过减小同步代码块的方式提高效率,然后不可行
			synchronized (Mgr05.class) {
				try {
					Thread.sleep(1);
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
				instance = new Mgr05();
			}

		}
		return instance;
	}

	public void m() {
		System.out.println("m");
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			new Thread(() -> {
				System.out.println(Mgr05.getInstance().hashCode());

			}).start();
		}
	}
}
package 单例模式;

public class Mgr06 {
	
	private  volatile static Mgr06 instance;

	private Mgr06() {

	}

	public   static Mgr06 getInstance() {
		if (instance == null) {
			// 双重检查
			synchronized (Mgr06.class) {
				if (instance == null) {
					try {
						Thread.sleep(1);
					} catch (Exception e) {
						// TODO: handle exception
						e.printStackTrace();
					}
					instance = new Mgr06();
				}
			}

		}
		return instance;
	}

	public void m() {
		System.out.println("m");
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			new Thread(() -> {
				System.out.println(Mgr06.getInstance().hashCode());

			}).start();
		}
	}
}
package 单例模式;

/*
 * 静态内部类的方式
 * JVM保证单例
 * 加载外部类时不会加载内部类   这样可以实现懒加载
 */
public class Mgr07 {
	
	private Mgr07()
	{
		
	}
	

	private  static class Mgr07Holder
	{
		private final static Mgr07 instance = new Mgr07();
	}

	public static Mgr07 getInstance() {
		return Mgr07Holder.instance;
	}

	public void m() {
		System.out.println("m");
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			new Thread(() -> {
				System.out.println(Mgr07.getInstance().hashCode());

			}).start();
		}
	}
}

package 单例模式;

/*
 * 不仅可以解决线程同步,还能防止反序列化
 */
public enum Mgr08 {
	
	instace;
	
	public void m() {}
	
	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			new Thread(() -> {
				System.out.println(Mgr08.instace.hashCode());
			}).start();
		}
	}
}

posted @ 2020-08-05 18:16  Akmf's_blog  阅读(96)  评论(0)    收藏  举报