目录
单例设计
单例设计的核心本质在于一个JVM的进程之中只允许拥有一个实例化对象。
在单例设计中,一共分为两种 “饿汉式单例"和"懒汉式单例”。
两种的单例的区别:
1、饿汉式单例是在类中直接final定义在类加载时进行实例化,而懒汉式则是先定义需要实例时才会进行实例化操作。
2、由于两种单例设计模式的不同,饿汉式在资源的把控上不及懒汉式,懒汉式在需要实例才会实例,而饿汉式在类加载时会开辟空间占用内存。
3、饿汉式是线程安全的、懒汉式是线程不安全的,需要用到同步锁来完成单例。
4、在执行的效率上饿汉式占优,懒汉式应需要加锁,所以执行的性能不如饿汉式。
饿汉式单例设计
由于饿汉式单例直接使用了final修饰符创建了一个示例,返回的一定是一个实例化对象,所以线程天生就是安全的。
示例:
public class TestOne {
public static void main(String[] args) {
/*饿汉式单例*/
Ball ball = Ball.getInstance();
ball.print();
}
}
class Ball {
/**
* 直接对类进行实例化
*/
private static final Ball BALL = new Ball();
private Ball() {
}
/**
* 由于调用全部返回BALL,只生成BALL一个对象。
* @return 返回实例化对象
*/
public static Ball getInstance() {
return BALL;
}
public void print(){
System.out.println("饿汉式单例!!!");
}
}
结果:
饿汉式单例!!!
懒汉式单例设计
由于懒汉式单例没有使用final修饰,所以当多个线程实例化懒汉式单例设计时,就会出问题,所以需要在方法内使用synchronized和反射来进行处理,但它对资源的占用也相对的来说比较少。
public class TestOne {
public static void main(String[] args) {
/*懒汉式单例*/
Ball ball = Ball.getInstance();
ball.print();
}
}
class Ball {
/**
* 先不直接实例化类,只定义
*/
private static Ball ball;
private Ball() {
}
/**
* 当需要使用此类时,进行实例化操作
* 节省资源
*
* @return 返回Ball实例化对象
*/
public synchronized static Ball getInstance() {
/*判断是不是第一次调用*/
if (ball == null) {
//进行实例化
ball = new Ball();
}
return ball;
}
public void print() {
System.out.println("懒汉式单例!!!");
}
}
结果:
懒汉式单例!!!