singleton

单例模式的应用场景

当你需要有且仅有一个对象,供全局使用,比如读取配置文件、数据库连接池、线程池等等

为什么要单例模式

  • 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。

  • 控制资源的情况下,方便资源之间的互相通信。如线程池等。

java单例模式

  • 饿汉模式
package singleton;

public class Hungry {
    private static Hungry singleton = new Hungry(); // 类加载的时候 就创建了

    private Hungry() {

    }

    public static Hungry getHungryInstance() {
        return singleton;
    }
    
}

  • 懒汉模式
package singleton;

public class Lazy {
    private Lazy() {

    }

    private static Lazy instance;

    public static Lazy getLazyInstance() {
        if (instance == null) {
            instance = new Lazy();
        }
        return instance;
    }
}

“饿汉”、“懒汉”区别

  • 类加载时,对象是否创建;饿汉加载时较慢,创建了单例对象,使用对象时很快;懒汉反之
  • 线程安全问题 饿汉是安全,懒汉不安全

网上找的一个读取配置文件的小案例

package org.jediael.util;  
  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Properties;  
  
public class BasicConfiguration {  
  
      
    private Properties pros = null;  
      
    private static class ConfigurationHolder{  
        private static BasicConfiguration configuration = new BasicConfiguration();  
    }  
      
    public static BasicConfiguration getInstance(){  
        return ConfigurationHolder.configuration;  
    }  
      
    public String getValue(String key){  
        return pros.getProperty(key);  
    }  
      
    private BasicConfiguration(){  
        readConfig();  
    }  
      
  
  
    private void readConfig() {  
        pros = new Properties();          
        InputStream in = null;  
        try {  
            in = new FileInputStream(Thread.currentThread().getContextClassLoader().getResource("")  
                    .getPath() + "search.properties");  
            pros.load(in);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }catch (IOException e) {  
            e.printStackTrace();  
        }finally{  
            try {  
                in.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  

你可能感兴趣的:(singleton)