单例模式

目的

为了让一个类有且仅有一个实例

优点

  1. 只允许一个,节省空间

  2. 不用频繁创建删除,提高性能

缺点

  1. 不容易扩展
  2. 长期不使用会被系统当作垃圾回收,造成系统状态的丢失

实现

要点

  1. 防止外界随意的创建对象=》一个私有的构造函数
  2. 保证只有一个实例 =》在私有静态属性中进行声明(饿汉创建,懒汉声明)
  3. 提供这个实例 =》提供静态的公有方法创建和获取私有对象

代码

问题

//会不会报错?
public class test {
public static void main(String[] args) {
Sun sun1=new Sun();
}
}
class Sun{
Sun sun=new Sun();//它会一直创建Sun对象,解决:用static修饰
} //运行结果
//Exception in thread "main" java.lang.StackOverflowError
// at com.imooc.Sun.<init>(test.java:10).....

为什么会报StackOverflowError异常?

图片解释:

第4行开始在栈内存中声明一个叫s的sun对象,并指向堆内存中地址为“0xA”的Sun对象,此时地址“OxA“的Sun对象中有一个实例化本类的属性,所以它又指向地址"0xB" 的Sun对象,此时地址"0xB" 中有一个Sun类型的属性......所以会一直创建Sun对象,出现栈溢出

饿汉式

//饿汉式
public class SingletonTwo {
//私有构造函数
private SingletonTwo(){
}
/**私有静态属性
为什么加static,假设不加static,就不能保证只有一个实例,可能会出现上面的问题
为什么加private,假设不加private,外界就可以用SingletonTwo.instance=null,把你对象置为空,有危险
*/
private static SingletonTwo instance=new SingletonTwo();
/**公共返回
为什么加static,不加static访问该方法的话需要进行实例化,但是该类已经把构造方法私有化,没办法实例,所以只能用static通过“类名.方法名()”调用
*/
public static SingletonTwo getInstance(){
return instance;
}
}

每次调用前就实例化好了,空间换时间,提前加载以后调用更快

懒汉式

//懒汉式
public class SingletonOne {
private SingletonOne(){ }
private static SingletonOne instance=null; public static SingletonOne getSingletonInstance(){
if (instance==null)//一定要判断
instance= new SingletonOne();
return instance;
}
}

只有每次调用的时候才会实例化,时间换空间,但是当多线程同时访问这个方法时,会存在危险

比如有线程thread1和thread2,thread1第一次运行到第9行,满足条件正准备向下执行时,thread2抢到了执行权限,thread2直接调用getSingletonInstance方法创建了一个SingletonOne对象,thread2执行完后,thread1继续刚才的执行,从第10行开始,最后又创建了一个SingletonOne对象,此时就不满足只创建一个实例的条件了
解决:给getSingletonInstance()方法加锁

使用场景

  1. 对系统内资源同意读写的,配置文件,如mysql的名字,数据库名,账号密码
  2. 创建对象资源过多

java的单例模式小知识点的更多相关文章

  1. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  2. Java枚举的小知识点

    enum 是jdk1.5引入的,使用它可以创建枚举类型,就像使用class创建类一样. enum关键字创建的枚举类型默认是java.lang.Enum(一个抽象类)的子类 用法1 常量 一般定义常量都 ...

  3. java中的小知识点

    1.数据类型的相关知识点 1.1.java内置封装类的转换 java中内置的封装类Byte.Integer.Float.Double和Long都可以转换成double类型的数值:因为这些封装好的类中都 ...

  4. JAVA基础知识|小知识点

    1.强烈建议,不使用char类型 那么,到底为什么java里不推荐使用char类型呢?其实,1个java的char字符并不完全等于一个unicode的字符.char采用的UCS-2编码,是一种淘汰的U ...

  5. Java学习过程中的总结的小知识点(长期更新)

    Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...

  6. C#、Java中的一些小知识点总结(持续更新......)

    前言:在项目中,有时候一些小的知识,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小知识点,以备用,并持续更新...... 1.禁用DataGridV ...

  7. java小知识点简单回顾

    1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...

  8. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  9. jQuery 小知识点(插件)

    1.jQuery插件小知识点: 估计很多人都没弄明白下面的东西,特从网络上搜索了下面的知识,自己以后用起来也比较方便: $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例 ...

随机推荐

  1. java架构《并发编程框架篇 __Disruptor》

    Disruptor入门   获得Disruptor 可以通过Maven或者下载jar来安装Disruptor.只要把对应的jar放在Java classpath就可以了. 基本的事件生产和消费 我们从 ...

  2. 7. Linux命令行的通配符、转义字符

    1.命令行的通配符 举例:1)列出所有在/dev 目录中以sda 开头的文件 [root@Centos test]# ll /dev/sda* brw-rw----. 1 root disk 8, 0 ...

  3. springboot基础配置-->Properties配置

    Spring Boot项目中的application.properties配置文件一共可以出现在如下4个位置: 项目根目录下的config文件夹中. 项目根目录下. classpath下的config ...

  4. jvm系列五-java内存模型(2)

    原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...

  5. 给jekyll博客添加搜索功能

    使用SWIFTYPE为jekyll博客添加搜索引擎 步骤 1.首先去swiftype注册一个账号 2.接着添加自己想要配置的网站地址并为新设定的引擎添加一个名字(非会员只能设置一个引擎). 3.收到验 ...

  6. Web APP和原生 APP的不同

    我们现在手机中的APP,大部分都是混合APP,也就是既用到了原生APP的基础,又用到了Web APP的基础,混合的比例从0%到100%之间不等.更好的了解APP的类型,有助于我们学则合适的测试策略.今 ...

  7. Codeforces Round #594 (Div. 2) D1 - The World Is Just a Programming Task

    思路:枚举换的位置i,j 然后我们要先判断改序列能否完全匹配 如果可以 那我们就需要把差值最大的位置换过来 然后直接判断就行

  8. The Preliminary Contest for ICPC Asia Shenyang 2019 D. Fish eating fruit(树形dp)

    题意:求一棵树上所有路径和模3分别为0 1 2 的权值的和 思路:树形dp 增加一个记录儿子节点满足条件的个数的数组 不要放在一起dp不然答案跟新会有问题 #include <bits/stdc ...

  9. Luogu 2017 Autumn Camping 游记

    颓得不行的我到D2才想起来自己可以写一篇low得不能再low的游记,然后就动笔了...... Day0 愉快地看着三联,想着别人放一天我放四天的悠闲生活,内心甚是平静.然而晚上回到家就开始浪了,看完了 ...

  10. 哈希算法解决:HDU1686 && POJ2774 && POJ3261

    HDU1686 题意: 找A串在B串中的出现次数(可重叠),可用KMP做,这里只提供哈希算法做的方法 题解: 先得到A串的hash值,然后在B中枚举起点,长度为lena的子串,检验hash值是否相同就 ...