java的单例模式小知识点
单例模式
目的
为了让一个类有且仅有一个实例
优点
只允许一个,节省空间
不用频繁创建删除,提高性能
缺点
- 不容易扩展
- 长期不使用会被系统当作垃圾回收,造成系统状态的丢失
实现
要点
- 防止外界随意的创建对象=》一个私有的构造函数
- 保证只有一个实例 =》在私有静态属性中进行声明(饿汉创建,懒汉声明)
- 提供这个实例 =》提供静态的公有方法创建和获取私有对象
代码
问题
//会不会报错?
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()方法加锁
使用场景
- 对系统内资源同意读写的,配置文件,如mysql的名字,数据库名,账号密码
- 创建对象资源过多
java的单例模式小知识点的更多相关文章
- 记录这段时间java编程的小知识点
记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift table 同时按,是整体左 ...
- Java枚举的小知识点
enum 是jdk1.5引入的,使用它可以创建枚举类型,就像使用class创建类一样. enum关键字创建的枚举类型默认是java.lang.Enum(一个抽象类)的子类 用法1 常量 一般定义常量都 ...
- java中的小知识点
1.数据类型的相关知识点 1.1.java内置封装类的转换 java中内置的封装类Byte.Integer.Float.Double和Long都可以转换成double类型的数值:因为这些封装好的类中都 ...
- JAVA基础知识|小知识点
1.强烈建议,不使用char类型 那么,到底为什么java里不推荐使用char类型呢?其实,1个java的char字符并不完全等于一个unicode的字符.char采用的UCS-2编码,是一种淘汰的U ...
- Java学习过程中的总结的小知识点(长期更新)
Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...
- C#、Java中的一些小知识点总结(持续更新......)
前言:在项目中,有时候一些小的知识,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小知识点,以备用,并持续更新...... 1.禁用DataGridV ...
- java小知识点简单回顾
1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...
- android 小知识点
小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...
- jQuery 小知识点(插件)
1.jQuery插件小知识点: 估计很多人都没弄明白下面的东西,特从网络上搜索了下面的知识,自己以后用起来也比较方便: $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例 ...
随机推荐
- Geotools操作GeoJSON:解析FeatureCollection对象文件
Geotools操作GeoJSON:解析FeatureCollection对象文件 一.解析FeatureCollection对象文件 1.1 geotools操作GeoJSON过程中的问题及相关源码 ...
- CCF CSP 202009-1 称检查点查询
202009-1 称检查点查询 题目背景 2020年6月8日,国务院联防联控机制发布<关于加快推进新冠病毒核酸检测的实施意见>,提出对"密切接触者"等八类重点人群&qu ...
- jvm系列五-java内存模型(2)
原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...
- cassandra权威指南读书笔记--Cassandra架构(1)
结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...
- WPF 之 Binding 对数据的校验与转换(三)
一.前言 Binding 的作用就是架在 Source 和 Target 之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实中的桥梁会设置一些关卡进行安检一样,Binding 这座桥上也可以设 ...
- SpringMVC学习笔记2
一.日期赋值 目标:在springMVC中日期赋值兼容性更广泛 不能直接处理,必须使用转换器1.定义转换器,实现接口Converter<From,To> package com.zy.co ...
- Scrambled Polygon POJ - 2007 极角排序
题意: 给你n个点,这n个点可以构成一个多边形(但是不是按顺序给你的).原点(0,0)为起点,让你按顺序逆序输出所有点 题解: 就是凸包问题的极角排序 用double一直Wa,改了int就可以了 // ...
- codeforces 86D D. Powerful array
An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, a ...
- java——API
API定义: 可以网上下载一个jdk_api文档用来查找一些函数. 匿名对象的创建 匿名对象做为返回值和参数实例: Random的使用:
- C++实现邻接表
对于无向图(V0,V1),(V1,V2),(V2,V3),(V0,V2)对应的邻接表表示就是 在代码中,你要单独对V1.V2.V3创建一种结构体类型.在对后面的节点0,1,2,3创建一种结构体类型 代 ...