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实例 ...
随机推荐
- (四)Springboot以jar包方式启动、关闭、重启脚本
Springboot以jar包方式启动.关闭.重启脚本 1.启动 2.关闭 3.重启 4.脚本授权 SpringBoot: nohup java -jar zlkj-data-server-1.0-S ...
- Spark使用Java、Scala 读取mysql、json、csv数据以及写入操作
Spark使用Java读取mysql数据和保存数据到mysql 一.pom.xml 二.spark代码 2.1 Java方式 2.2 Scala方式 三.写入数据到mysql中 四.DataFrame ...
- Session (简介、、相关方法、流程解析、登录验证)
Session简介 Session的由来 Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能 ...
- Aruba无线控制器常用操作
初始配置 1.console到初始化的无线控制器上 Enter System name [Aruba7005]: Enter VLAN 1 interface IP address [172.16.0 ...
- Java|ArrayList源码分析|add()增加方法和grow()扩容方法
本文结构: 1.介绍特点 2.基本方法 3.重点源码分析 1.介绍特点 ArrayList: 是List的一个具体实现子类,是List接口的一个数组实现 (里面必定维护了一个数组). 默认初始容量10 ...
- phpstorm如何设置字体
最近上手了一款轻量级IDE phpStorm,可是就在调整编辑器字体大小时却遇到问题了, 发现字体大小无法调整,另外还有字体大小往左还有个"√",始终无法去掉,这个勾限制了字体系列 ...
- 回文树(回文自动机PAM)小结
回文树学习博客:lwfcgz poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ...
- P2762 太空飞行计划问题 (最小割)
题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器 购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益 题解:......................... ...
- Power Strings POJ - 2406 后缀数组
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- 恢复win10 LTSC 2019 图片查看器功能
1.开始–运行–输入"regedit"打开注册表. 2. 在打开的注册表编辑器中,从左侧依次展开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win ...