单例设计模式
单例是为了解决全局只有一个实例这样的问题.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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;
}
}
解决方法:
没有所谓的平步青云!
活在当下!
坚持一下
再坚持一下!
...