单例模式

package com.sosop.designpattern.singleton;

/*
 * 单件模式:保证一个类必须只有一个实例,并提供全局的访问点
 * 
 * 所以单例模式必须有私有的构造器,没有私有构造器根本不用谈单件
 * 
 * 必须考虑到并发情况下创建了多个实例对象
 * */

/**
 * 虽然有锁,但是只在第一次创建对象的时候加锁,并发时不会存在效率问题 
 * 关键字: volatile
 * **/
public class Singleton1 {

	private volatile static Singleton1 instance;

	private Singleton1() {
	}

	public static Singleton1 getInstance() {
		synchronized (Singleton1.class) {
			if (instance == null) {
				instance = new Singleton1();
			}
		}
		return instance;
	}
}

/**
 * 优势:简单,不存在并发时创建不同对象的情况 缺点:不管用户是否想要实例,只要类加载器一加载类就创建了实例
 **/
class Singleton2 {
	// 饥汉式单例
	private static Singleton2 instance = new Singleton2();

	private Singleton2() {
	}

	public static Singleton2 getInstance() {
		return instance;
	}
}

/**
 * 这个方法虽然加锁了,没此只允许一个线程的访问,但是效率降低了,
 * 每次获取对象时都得加锁,同步锁是一个很耗时的操作
 * 
 **/
class Singleton3 {

	private static Singleton3 instance;

	private Singleton3() {
	}

	public static Singleton3 getInstance() {
		synchronized (Singleton3.class) {
			if (instance == null) {
				instance = new Singleton3();
			}
		}
		return instance;
	}
}

 

你可能感兴趣的:(java,单例,设计模式,单件)