单例设计模式,对于一个类只能得到一个对象,无论调用多少个线程都只能获得这个类的一个对象。
第一种方法,饿汉式,缺点是在类加载的时候就将对象new了,这样对于内存来说是一个浪费。
public class Student {
//直接将对象在内部new好,并赋值给静态属性
private static final Student STU = new Student();
private Student(){}//上来直接将构造方法属性私有化
public static Student getInstance(){
return STU;
}
public static void main(String[] args) {
for(int i = 0;i < 20;i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Student.getInstance().hashCode());
}
}).start();
}
}
}
第二种方法,懒汉式,较为完美,只有在使用对象的时候再去调用getInsytance方法,不会提前加载,两次判断保证了,在多线程访问的时候,不会造成错误。
public class Singleton {
private static Singleton SIN;
private Singleton(){}
public static Singleton getInstance() {
//首先判断属性是否为空
if(SIN == null) {
//若为空则开始准备new,但是需要注意,如果下面内容不加锁
//则有可能new两次
//并且加锁之后,还需要再次进行判断
synchronized (Singleton.class) {
if(SIN== null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
SIN = new Singleton();
return SIN;
}
}
}
return SIN;
}
public static void main(String[] args) {
for(int i = 0;i < 10;i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Singleton.getInstance().hashCode());
}
}).start();
}
}
}
第三种,静态内部类
public class Person {
private Person(){}
//静态内部类,在第一次加载的时候不会被加载,只有在调用里面静态方法的时候才会被加载
private static class Person1{
private final static Person SIN = new Person();
}
public static Person getIntance(){
return Person1.SIN;
}
public static void main(String[] args) {
for(int i = 0;i < 10;i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Person.getIntance().hashCode());
}
}).start();
}
}
}