单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只能生成一个唯一的实例对象。
保证一个类、只有一个实例存在,同时提供能对该实例进行访问的全局访问方法。
1.在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象。
2.在整个程序空间使用全局变量,共享资源。
3.在大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
3.分类:
1.饿汉式:(类加载的时候就创建对象)
不管是多线程还是单线程都可以保证只有一个类的实例
2.懒汉式:(需要时才会创建对象)
在单线程中可以保证只有一个类的实例
但是在多线程就无法保证了(在方法上加上synchronized就可以保证只有一个实例了)
3.双重检查:(提高程序的运行效率)
====================================饿汉式===========================================
package com.test;
/**
* 饿汉式(类加载的时候就创建对象)
*
* @author qianqf
*
*/
public class Student {
public static final Student student = new Student();
//学生姓名
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 构造函数私有化
*/
private Student() {
}
/**
* 提供一个全局的静态方法
*/
public static Student getStudent() {
return student;
}
}
-----------------------------------------------------------------------
package com.test;
public class Test {
public static void main(String[] args) {
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
s1.setName("张三");
s2.setName("李四");
System.out.println(s1.getName());
System.out.println(s2.getName());
}
}
=============================================懒汉式=============================================
package com.test;
/**
* 懒汉式(等用到的时候再创建对象)
*
* @author qianqf
*
*/
public class Student02 {
private static Student02 student;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 构造函数私有化
*/
private Student02() {
}
/**
* 提供一个全局的静态方法,单线程时才能保证一个实例 而多线程时必须使用同步(synchronized),才能保证一个实例
*/
public static synchronized Student02 getStudent() {
if (student == null) {
student = new Student02();
}
return student;
}
}
----------------------------------------------------------------------------------------------------------
package com.test;
public class Test02 {
public static void main(String[] args) {
Student02 s1 = Student02.getStudent();
Student02 s2 = Student02.getStudent();
s1.setName("张三");
s2.setName("李四");
System.out.println(s1.getName());
System.out.println(s2.getName());
}
}
==========================================懒汉式(双重检查)================================================
package com.test;
/**
* 懒汉式(等用到的时候再创建对象)
*
* @author Administrator
*
*/
public class Student03 {
private static Student03 student;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 构造函数私有化
*/
private Student03() {
}
/**
* 提供一个全局的静态方法,单线程时才能保证一个实例 而多线程时必须使用同步(synchronized),才能保证一个实例 经过双重检查来提交效率
*/
public static Student03 getStudent() {
if (student == null) {
synchronized (Student.class) {
if (student == null) {
student = new Student03();
}
}
}
return student;
}
}