多线程的单例设计模式
目标:保证类在内存中只有一个对象
实现方法:
1.控制类的创建,不让其他类创建本类的对象 private
2.在本类中定义一个本类的对象 singleton s
3.提供公共的访问方式Public static singleton getInstance(){return s}
单例写法:
(1)饿汉式
package javastudy01;
public class test {
public static void main(String[] args) {
// singleton s1 = singleton.s; 在 public static singleton s = new singleton();条件下
// singleton.s=null;会改变singleton中s的值,所以下面改为private
// singleton s2 = singleton.s ;
// System.out.println(s1==s2);
singleton s1 = singleton.getInstance();
singleton s2 = singleton.getInstance();
System.out.println(s1==s2);
}
}
class singleton {
//1.私有构造方法,其他类不能访问该构造方法,即new singleton()会报错
private singleton(){}
//2.创建本类对象(类自己创建)因为其他类不能创建对象所以下面main中只能通过类名.s去调用对象
//成员对象私有 无法通过类名去调用,即singleton.s会报错
private static singleton s = new singleton();
//3.对外提供公共的访问方法
public static singleton getInstance(){
return s;
}
}
运行结果
(2)懒汉式
package javastudy01;
public class test2 {
public static void main(String[] args) {
singleton1 s1 = singleton1.getInstance();
singleton1 s2 = singleton1.getInstance();
System.out.println(s1==s2);
}
}
class singleton1{
//1.私有构造方法,其他类不能访问该构造方法,即new singleton()会报错
private singleton1(){}
//2.声明一个引用
private static singleton1 k ;
//3.对外提供公共访问方法
public static singleton1 getInstance(){
if(k==null){
//如果线程1在此等待,2页在此等待,那么当两个线程继续执行时,会创建两个k
k= new singleton1();
}
return k;
}
}
运行结果
同上
饿汉式与懒汉式的区别
1.饿汉式先new,你需要时给你,浪费空间但时间快;懒汉式是需要时再给你new 浪费时间但是节约空间
2.多线程访问时饿汉式不会创建多个对象,但懒汉式会
(3)第三种方式
package javastudy01;
public class test3 {
public static void main(String[] args) {
singleton2 s1 = singleton2.s ;
// singleton2.s=null; 无法修改
singleton2 s2 = singleton2.s;
System.out.println(s1==s2);
}
}
class singleton2{
private singleton2(){}
public static final singleton2 s = new singleton2();
}