单例模式:
一个类只有一个实例,并提供一个访问它的全局访问点。
应用场景:创建一个唯一的变量(对象)。
1.场景问题:(读取配置文件到内存)
文件名:AppConfig.properties
内容:paramA=a
paramB=b
package computer;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Test {
public static void main(String[] args) {
AppConfig config=new AppConfig();
String paramA=config.getParameterA();
String paramB=config.getParameterB();
System.out.println("paramA="+paramA+"paramB="+paramB);
}
}
class AppConfig{
private String parameterA;
private String parameterB;
public AppConfig(){
readConfig();
}
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
private void readConfig() {
Properties p=new Properties();
InputStream in=null;
try {
in=AppConfig.class.getResourceAsStream("AppConfig.properties");
p.load(in);
this.parameterA=p.getProperty("paramA");
this.parameterB=p.getProperty("paramB");
}catch(IOException e) {
System.out.println("装载配置文件出错!");
e.printStackTrace();
}finally{
try {
in.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
问题:系统运行时,多处要用到配置文件,即系统会创建多个AppConfig的实例对象,资源浪费。
2.解决方案:(单例模式)
构造函数私有,用户无法通过new直接实例;静态方法负责检验并实例化自己,确保只有一个实例被创建。
注意:类中的私有成员变量也是静态的!
package computer;
public class Test {
public static void main(String[] args) {
Singleton s1=Singleton.GetInstance();
Singleton s2=Singleton.GetInstance();
if(s1==s2) {
System.out.println("两个对象是相同的实例!");
}else {
System.out.println("两个对象是不同的实例!");
}
}
}
class Singleton{
private static Singleton instance;
//构造方法为私有,外界无法用new创建此类的对象
private Singleton() {
}
public static Singleton GetInstance() {
//实例不存在就new一个新实例,存在就返回已经有的实例
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
缺点:多线程时可能同时有两个对象被创建。
3.多线程时的单例模式:
用到synchronized():被synchronized()修饰的区域每次只有一个线程可访问,其他线程若试图进入锁定的代码,将被阻止,直到对象被释放。
package computer;
public class Test {
public static void main(String[] args) {
Singleton s1=Singleton.GetInstance();
Singleton s2=Singleton.GetInstance();
if(s1==s2) {
System.out.println("两个对象是相同的实例!");
System.out.println("singleton1:"+s1.toString())