zl程序教程

您现在的位置是:首页 >  其他

当前栏目

单例设计模式

设计模式 单例
2023-09-11 14:14:08 时间

单例是为了解决全局只有一个实例这样的问题.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

02_饿汉式单例

HungrySingleton.java
package com.qianfeng.singleton;

import java.nio.file.attribute.UserDefinedFileAttributeView;

/**
* 饿汉式单例:因为类每次加载到内存的时候,就把这个实例instance就实例化好了
* instance是个静态的,他的创建是发生在类第一次加载到内存的时候.
* 有可能出现这种情况.我现在暂时不需要User对象,我只是想用一下User类里面的静态方法,
* 但是这时发现instance已经实例化好了,
* 所以造成了不必要的性能损耗
* 也造成了不必要的空间损耗
*/
public class HungrySingleton {
public static void main(String[] args) {
//通过单例类中指定的方法,进行对象的获取
//不能用new User();这种方式来获取类对象
User user=User.getUser();

/**
*测试是否是全局唯一
*/
for (int i=0;i<1000;i++){
User u = User.getUser();
if(user!=u){//比较的是地址
System.out.println("一个新的对象被实例化了");
}
}
System.out.println("程序结束");
}
}

/**
* 作为一个单例类,有且只能有一个实例
*/
class User{
//1.私有化构造方法
private User(){}

//2.设计一个私有的静态的当前类对象
//方式一
//设计instance为private的目的,防止外界直接通过User.instance=null;直接修改类对象
private static User instance=new User();
//方式二
/*
* static{
* instance=new User();
* }
* */

//3.提供一个方法,可以返回给调用方一个当前类对象
public static User getUser(){

return instance;
}
}


}

 

 ==============================================================================================================================================================

03_懒汉式单例

LazySigleton.java
package com.qianfeng.singleton;

public class LazySigleton {
public static void main(String[] args) {

for (int i=0;i<1000;i++){
Teacher.getTeacher();
}
}
}

class Teacher{
//1.构造方法私有化
private Teacher(){
System.out.println("一个新的Teacher对象被实例化了");
}

//2.没有直接实例化
private static Teacher instance;

//3.提供静态的,获取当前类对象的方法
public static Teacher getTeacher(){
//懒汉式,判断对象如果为空,才去创建对象
//懒汉式对空间的占用,优于饿汉式
if(instance==null){
instance=new Teacher();
}
return instance;
}
}

 

 =======================================================================================================================================

04_懒汉式模式多线程问题

MoreThreadSingleton.java
package com.qianfeng.singleton;

public class MoreThreadSingleton {
public static void main(String[] args) {

for (int i=0;i<1000;i++){
Thread thread = new Thread(()->{
Chairman.getInstance();
});
thread.start();
}
}
}
class Chairman{
private Chairman(){
System.out.println("一个新的对象被实例化了");
}

private static Chairman instance;

public static Chairman getInstance(){
if (instance==null){
instance=new Chairman();
}
return instance;
}

}

 

 解决方法: