Java单例模式--懒汉式和饿汉式(Demo)
【摘要】
你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java单例模式,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助。
1.JAVA基础面试常考问题 ...
你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java单例模式,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助。
1.JAVA基础面试常考问题
: JAVA面试基础常考题汇集2.JAVA面试SSM框架常考
:JAVA框架面试题汇集
一、序言
单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。
- 1、单例类
只能有一个实例
。 - 2、单例类
必须自己创建自己的唯一实例。
- 3、单例类
必须给所有其他对象提供这一实例。
二、饿汉式
饿汉式:在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。
参考例子如下
- 我们用HashSet来存储对象,因为HashSet只能存放不同的元素,如果输出的对象唯一,则代表是单例模式。
参考class King
HashSet类,是存在于java.util包中的类 。同时也被称为集合,该容器中只能存储不重复的对象。
import java.util.HashSet;
public class TheadDemo {
static HashSet<King> hs = new HashSet<>();
static Runnable r = new Runnable() {
@Override
public void run() {
//获取单例对象
King king = King.currentInstance();
//将获取到的单例对象添加到集合中
hs.add(king);
}
};
public static void main(String[] args) {
//需求:多条线程同时去获取单例对象,然后将获取到的单例对象添加到HashSet中
// 创建多个线程对象,同时访问 单例对象
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(r);
thread.start();
}
System.out.println(hs);
}
}
//饿汉式
class King {
private static King instance = new King();
private King(){}
public static King currentInstance() {
return instance;
}
}
[King@2cf062b0]
小结:如King类,先创建一个类,直接在内中初始化,再创建一个方法调用这个类返回值是该类的对象。
三、懒汉式
懒汉式:当程序第一次访问单例模式实例时才进行创建。
参考class Queue
ps:懒汉式本身是非线程安全的 --为了实现线程安全加了synchronized
import java.util.HashSet;
public class TheadDemo {
static HashSet<Queue> hs = new HashSet<>();
static Runnable r = new Runnable() {
@Override
public void run() {
//获取单例对象
Queue queue = Queue.currentInstance();
//将获取到的单Queue对象添加到集合中
hs.add(queue);
}
};
public static void main(String[] args) {
//需求:多条线程同时去获取单例对象,然后将获取到的单例对象添加到HashSet中
// 创建多个线程对象,同时访问 单例对象
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(r);
thread.start();
}
System.out.println(hs);
}
}
//懒汉式
class Queue {
private static Queue instance;
private Queue() { }
//使用同步代码块,同步方法,以及同步锁都可以解决
public synchronized static Queue currentInstance() {
if (instance == null) {
instance = new Queue();
}
return instance;
}
}
[Queue@3cbeafaf]
小结:如Queue类,先创建一个对象没有给他赋值,默认为null,如果调用的话我就自己创建一个对象,再次调用的话就返回原来创建的对象。
四、拓展小结
你一定很好奇为什么叫饿汉式和懒汉式,我们如何记忆呢?
饿汉式:直接new对象,再创建方法调用
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
不管程序是否需要这个对象的实例,总是在类加载的时候就先创建好实例,理解起来就像不管一个人想不想吃东西都把吃的先买好,如同饿怕了一样。
懒汉式:如果需要在创建,如果已经创建则返回原来创建的。
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
如果一个对象使用频率不高,占用内存还特别大,明显就不合适用饿汉式了,这时就需要一种懒加载的思想,当程序需要这个实例的时候才去创建对象,就如同一个人懒的饿到不行了才去吃东西。
The best investment is to invest in yourself
2020.06.01 记录辰兮的第73篇博客
文章来源: blessing.blog.csdn.net,作者:辰兮要努力,版权归原作者所有,如需转载,请联系作者。
原文链接:blessing.blog.csdn.net/article/details/106469158
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)