保证一个类、只有一个实例存在,同时提供能对该实例进行访问的全局访问方法。
2.为什么要用单例模式? 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; } }