重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Java中的单例模式是什么-创新互联

这篇文章给大家分享的是有关 Java中的单例模式是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的佛山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

首先我们来看看单例模式的定义:

单例模式是 Java 中最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

为了保证内存中有且仅有一个对象,避免频繁的创建对象造成对内存的消耗,让所有需要调用这个对象的地方都使用这一个单例对象。

接下来我们看看单例模式的类型:

1、懒汉式

懒汉式指的是在需要使用的时候才会去创建该单例对象。

懒汉式单例模式实现:

public class Singleton {
	private static Singleton singleton;
	private Singleton(){
	
	}
	public static Singleton getInstance(){
		if (singleton == null) {
			singleton = new Singleton();
	    }
	    return singleton;
}

对于懒汉式单例实现存在一个问题,就是如何确保只创建一个对象?若两个或多个线程同时判断singleton为空,则会创建多个对象。因此我们需要解决线程安全问题。

说到线程安全想到的就是加锁了,加锁无非是在方法或者类对象上加锁。

//在方法上加锁
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static synchronized Singleton getInstance() {
    	if (singleton == null) {
        	singleton = new Singleton();
    	}
    return singleton;
	}
}

//在类对象上加锁
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
    synchronized(Singleton.class) {   
        if (singleton == null) {
            singleton = new Singleton();
        }
    }
    return singleton;
	}	
}

这两个方法,能解决多线程同时创建单例对象的问题,但每次获取对象都需要先获取锁,并发性能差。因此还需要优化,优化目标为:如果没有实例化对象,则加锁创建,如果有实例化对象,则直接返回。

(学习视频推荐:java课程)

对于在方法上加锁,无论是否存在实例化对象都需要加锁。故我们需要优化的是在类对象上加锁。

//DCL单例模式(Double Check + Lock)
public class Singleton {
	//volatite关键词防止指令重排序,下文介绍
	private static volatile Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
	//如果singleton不为空,则直接返回对象,若多个线程发现singleton为空,则进入分支
		if (singleton == null) {
		//多个线程同时争抢一个锁,只有一个线程能成功,其他线程需等待
			synchronized(Singleton.class) {
			//争抢到锁的线程需再次判断singleton是否为空,因为有可能被上个线程实例化了
			//若不为空则实例化,后续线程再进入的时候则直接返回该对象
			//对于之后所有进入该方法的线程则无需获取锁,直接返回对象   
        	if (singleton == null) {
           		singleton = new Singleton();
        	}
    		}
		}
    	return singleton;
	}	
}

上述代码中添加了volatile关键词防止指令重排序。

2、饿汉式

饿汉式指的是在类加载时即创建该单例对象。

饿汉式单例模式实现:

public class Singleton {
	private static final Singleton singleton = new Singleton();
	private Singleton(){
	
	}
	public static Singleton getInstance(){
		return singleton;
	}

总结:

懒汉式:需要时才去实例化对象,在开发中如果对内存要求很高即采用懒汉式,在多线程环境下,应该使用DCL单例模式,使用DCL单例模式,解决了并发安全及性能低下的问题,若添加volatile关键词还能防止指令重排序而发生的NPE异常。

饿汉式: 类加载时就已经实例化对象,如果对内存要求不高即采用饿汉式,简单不易出错,且没有任何并发安全和性能问题。

感谢各位的阅读!关于 Java中的单例模式是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!


网页标题:Java中的单例模式是什么-创新互联
本文地址:http://cqcxhl.com/article/cshgdp.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP