同步操作将从 flatfish/Java-Review 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
饿汉式 线程安全的(静态成员)
饿汉式 线程安全的(静态代码块)
懒汉式 线程不安全的 (一次判断)
懒汉式 线程不安全的 (两次判断)
懒汉式 线程安全的 (方法加锁)
懒汉式 线程安全的 (静态代码块加锁)
懒汉式 线程安全的 (静态代码块加锁 - 缩小静态代码块的区域)线程安全的双重检查锁
懒汉式 线程安全的 (静态代码块加锁 - 缩小静态代码块的区域)线程安全的双重检查锁+Volatile关键字
静态内部类 线程安全的
枚举 绝对安全的
步骤
代码实现
public class Case01 {
private static Case01 instance = new Case01();
private Case01() {
}
public static Case01 getInstance() {
return instance;
}
}
优缺点比较
步骤
代码实现
public class Case02 {
private static Case02 instance;
static {
instance = new Case02();
}
private Case02() {
}
public static Case02 getInstance() {
return instance;
}
}
优缺点比较
步骤
代码实现
public class Case03 {
private static Case03 instance;
private Case03() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Case03 getInstance() {
if (instance == null) {
instance = new Case03();
}
return instance;
}
}
优缺点
优点,起到了懒加载的效果,什么时候用什么时候再加载,但是只能再单线程下使用后
缺点:如果在多线程情况下,一个线程进入了if(instance == null)还没有来得及向下进行,而另外一个线程也执行了这个判断语句,这个时候会产生多个实例,所以在多线程情况下不可以使用这种方式
总结:实际开发中不可以使用这种方式
步骤
代码实现
public class Case04 {
private static Case04 instance;
private Case04() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Case04 getInstance() {
if (instance == null) {
if (instance == null) {
instance = new Case04();
}
}
return instance;
}
}
优缺点
优点:起到了懒加载的效果,什么时候用什么时候再加载,但是只能再单线程下使用后,
缺点:如果在多线程情况下,一个线程进入了if(instance == null)还没有来得及向下进行,而另外一个线程也执行了这个判断语句,这个时候会产生多个实例,所以在多线程情况下不可以使用这种方式,虽然多判断了一次,但是还是会多线程并发访问的问题
总结:实际开发中不可以使用这种方式
步骤
代码实现
public class Case05 {
private static Case05 instance;
private Case05() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized static Case05 getInstance() {
if (instance == null) {
instance = new Case05();
}
return instance;
}
}
优缺点
优点:起到了懒加载的效果,什么时候用什么时候再加载,因为方法加锁,是线程安全的
缺点:锁所用于方法,范围太大了,影响效率
总结:实际开发中可以使用这种方式,但是又更好的方法
步骤
代码实现
public class Case06 {
private static Case06 instance;
private Case06() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Case06 getInstance() {
synchronized (Case06.class) {
if (instance == null) {
instance = new Case06();
}
return instance;
}
}
}
优缺点
优点:起到了懒加载的效果,什么时候用什么时候再加载,因为方法加锁,是线程安全的
缺点:锁所用于代码块。每次进入都要一次加锁判断,范围太大了,影响效率
总结:实际开发中可以使用这种方式,但是又更好的方法
步骤
代码实现
public class Case07 {
private static Case07 instance;
private Case07() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Case07 getInstance() {
if (instance == null) {
synchronized (Case07.class) {
if (instance == null) {
instance = new Case07();
}
}
}
return instance;
}
}
优缺点
优点:起到了懒加载的效果,什么时候用什么时候再加载,因为方法加锁,是线程安全的
缺点:锁所用于代码块。第一次进入都要一次加锁判断,之后进入不需要加锁,但是有可能会出问题
总结:实际开发中可以使用这种方式,但是又更好的方法
步骤
代码实现
public class Case08 {
private volatile static Case08 instance;
private Case08() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Case08 getInstance() {
if (instance == null) {
synchronized (Case08.class) {
if (instance == null) {
instance = new Case08();
}
}
}
return instance;
}
}
优缺点
优点:起到了懒加载的效果,什么时候用什么时候再加载,因为方法加锁,是线程安全的
添加了 volatile 关键字修饰,禁止了指令重排序,更安全了一些
缺点:锁所用于代码块。第一次进入都要一次加锁判断,之后进入不需要加锁,但是有可能会出问题
总结:实际开发中使用这种方式
步骤
代码实现
public class Case09 {
private Case09() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class Inner {
private static Case09 instance = new Case09();
}
public static Case09 getInstance() {
return Inner.instance;
}
}
优缺点
优点:是线程安全的,跟随类加载而加载
缺点:可能会创建了对象不使用,浪费空间
步骤
代码实现
public enum Case10{
INSTANCE;
public static Case10 getInstance() {
return INSTANCE;
}
}
优缺点
单例模式保证了 系统内存种只有该类的一个对象,节省了系统资源,对于一些需要频繁创建和销毁的对象,使用单例模式可以提高系统性能
当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
单例模式使用的场景:需要频繁的进行创建和销毁的对象,创建对象的时候消耗过多或耗费资源过多(也就是:重量级对象) 但又是经常用到的对象,工具类对象,频繁访问数据库或文件的对象(比如数据源.session工厂等)
对于非枚举实现的单例设计模式,可以通过反射创建对象,但是一般不会这么做,而枚举类型通过反射创建对象的时候,会抛异常
推荐使用双重检查锁+Volatile关键字
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。