单例设计模式:保证类在内存中只有一个对象
一、饿汉式:
1、私有构造方法:外界就不能创建对象
2、创建本类对象
3、对外提供公共的访问方法
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,创建本类对象
private static Singleton s = new Singleton();
//3,对外提供公共的访问方法
public static Singleton getInstance() { //获取实例
return s;
}
}
二、懒汉式:
1、私有构造方法:外界就不能创建对象
2、声明一个引用
3、对外提供公共的访问方法,创建对象
特点:
1、开发时不用:不安全,多线程时可能会创建多个对象
2、面试时用:单例的延迟加载模式
/*
* 懒汉式,单例的延迟加载模式
*/
/*class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,声明一个引用
private static Singleton s ;
//3,对外提供公共的访问方法
public static Singleton getInstance() { //获取实例
if(s == null) {
//线程1等待,线程2等待
s = new Singleton();
}
return s;
}
}
三、饿汉式和懒汉式的区别
1、饿汉式是空间换时间,一上来就创建对象占用了空间,但是时间快,懒汉式是时间换空间,上来先声明一个引用,然后进行判断浪费了时间
2、在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能会创建多个对象
四、第三种单例模式
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,声明一个引用
public static final Singleton s = new Singleton();
}
五、单例模式举例
1、Runtime类:每个java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。应用程序不能创建自己的Runtime类实例。
可以通过 getRuntimr() 方法返回与当前Java应用程序相关的运行时对象 。
源码:
private static Runtime currentRuntime = newRuntime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
补充:Timer类:一种工具,线程用其安排以后在后台线程中执行的任务,可安排任务执行一次,或者定期重复执行。
void schedule(TimerTask task, Date time):安排在制定的时间执行制定的任务。
void schedule(TimerTask task, Date time,long period):重复的固定延迟执行
TimerTask类:由Timer安排为一次执行或重复执行的任务,里面有run()方法,放置具体执行任务。
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Demo3_Timer {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Timer t = new Timer();
//在指定时间安排指定任务
//第一个参数,是安排的任务,第二个参数是执行的时间,第三个参数是过多长时间再重复执行
t.schedule(new MyTimerTask(), new Date(188, 6, 1, 14, 22, 50),3000);
while(true) {
Thread.sleep(1000);
System.out.println(new Date());
}
}
}
class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("起床背英语单词");
}
}