单例(基于多线程的编程)
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在项目的很多地方都会用到它,比如说数据库的链接。
使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
实现方法
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,并提供一个访问它的全局访问点:
- 创建私有静态对象
- 构造私有方法
- 创建公有静态get对象方法
三个要点
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
两种单态模式的区别
时间和空间
懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例。如果一直没有人使用的话,那就不会创建实例,节约内存空间。
延迟加载:开始不加载资源或者数据,等到马上就要使用这个资源或数据了才加载,所以也称LazyLoad(延迟加载)。
private static 类名 对象名;//声明对象
private 类名() {}//私有构造方法
public static 类名 get对象名(){//单例化对象
if(对象名 == null)
对象名 = new 类名();
return 对象名;
}
饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省运行时间。
private static 类名 对象名 = new 类名();
private 类名() {}
public static 类名 get对象名(){
return 对象名;
}
线程安全
从线程安全性上讲,不加同步的懒汉式是线程不安全的。
饿汉式是线程安全的,因为虚拟机保证了只会装载一次,在装载类的时候是不会发生并发的。
总结
单例类的构造函数为私有。
提供一个自身的静态私有成员变量。
提供一个公有的静态工厂方法。
单例模式的思想是什么?请写一个代码体现。
开发:饿汉式(是不会出问题的单例模式)
面试:懒汉式(可能会出问题的单例模式)
- 懒加载(延迟加载)
- 线程安全问题
- 是否多线程环境:是
- 是否有共享数据:是
- 是否有多条语句操作共享数据 :是
Runtime
Runtime类属于java.lang包中的类,Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
Runtime类的设计采用的是单例设计模式(饿汉式)。
实例
getRuntime():该方法用于返回当前应用程序的运行环境对象。
exec(String command):该方法用于根据指定的路径执行对应的可执行文件。
public static void main(String[] args) throws IOException, InterruptedException {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("C:\\Windows\\notepad.exe");//打开记事本程序,并返回一个进程
Thread.sleep(3000); //让当前程序停止3秒。
process.destroy();
}
运行结果
freeMemory():该方法用于返回Java虚拟机中的空闲内存量,以字节为单位。
maxMemory():该方法用于返回Java虚拟机试图使用的最大内存量。
totalMemory():该方法用于返回Java虚拟机中的内存总量。
public static void main(String[] args) throws IOException{
Runtime runtime = Runtime.getRuntime();
System.out.println("Java虚拟机中的空闲内存量:"+runtime.freeMemory());
System.out.println("Java 虚拟机试图使用的最大内存量:"+ runtime.maxMemory());
System.out.println("返回 Java 虚拟机中的内存总量:"+ runtime.totalMemory());
}
运行结果