定义:
确保一个类只有第一个实例,而且自行实例化,向整个系统提供这个实例
可以建立在目录,数据库连接等需要单线程操作的场合,用于实现对系统资源的控制
优点:
- 减少内存的开支
- 减少系统的性能开销
- 避免资源过度的占用
- 可以在系统设置全局的访问点
缺点:
- 无法创建子类,扩展困难,只能修改代码
- 对测试不利
- 单例模式与单一原则冲突
场景:
- 要求生成唯一序列的环境
- 在整体项目中需要一个访问点或共享数据
- 访问IO,访问数据库
- 需要单一许多静态常量和静态方法
package 单例模式;
//饿汉式
public class GolbalNum {
private static GolbalNum number = new GolbalNum();
private int sum = 0;
public static GolbalNum getGolbalNum(){
return number;
}
public synchronized int getsum(){
return ++sum;
}
}
//懒汉式
public class GolbalNum {
private static GolbalNum number =null;
private int sum = 0;
synchronized public static GolbalNum getGolbalNum(){
if(number==null){
number = new GolbalNum();
}
return number;
}
public synchronized int getsum(){
return ++sum;
}
}
package 单例模式;
public class NumThread extends Thread{
private String threadname;
public NumThread(String name){
threadname = name;
}
public void run(){
GolbalNum golbalNum = GolbalNum.getGolbalNum();
for(int i=0;i<10;i++){
System.out.println(threadname+"第"+golbalNum.getsum()+"次访问");
try {
this.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package 单例模式;
public class SingleDemo {
public static void main(String[] args){
NumThread thread1 = new NumThread("qyc");
NumThread thread2 = new NumThread("qcc");
thread1.start();
thread2.start();
}
}
qcc第1次访问
qyc第2次访问
qyc第4次访问
qcc第3次访问
qyc第5次访问
qcc第6次访问
qyc第7次访问
qcc第8次访问
qcc第10次访问
qyc第9次访问
qcc第11次访问
qyc第12次访问
qyc第14次访问
qyc第15次访问
qyc第16次访问
qcc第13次访问
qyc第17次访问
qcc第18次访问
qcc第19次访问
qcc第20次访问