【java】单例设计模式——饿汉式和懒汉式、Runtime、Timer

单例设计模式:保证类在内存中只有一个对象

一、饿汉式:

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("起床背英语单词");
	}
}



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love_Aym/article/details/79970674
个人分类: Java从入门到精通
上一篇【Java】【多线程】同步方法和同步代码块、死锁
下一篇【Java】【多线程】两个线程间的通信、wait、notify、notifyAll
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭