单例懒汉模式和饿汉模式,以及线程安全版懒汉模式
单例模式:是一种常见的设计模式,一个类只能创建出一个实例对象,这就是单例模式写法(封装)。
封装:就是对复杂事物的一种简化。可以说是对具有相同特征的一类事物进行抽象封装,抽象程度越高,封装就越彻底。这样有助于建立各个系统之间的低耦合关系,提高系统的独立性。其实封装并不是一种技术,而是一种思想。当一件事变得复杂,就需要从一个更高的层次来进行管理。
懒汉模式:在调用静态方法时才能创建对象
- 将构造器私有化。
- 一个静态私有属性存放当前类常量的对象变量。
- 提供一个公有的静态方法,获取到之前对象变量。
懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的
package im;
/**
- 懒汉模式
- @author MF
*
*/
public class Person {
private static Person person;
private Person() {
}
public static Person getPerson() {
if(person == null) {
person=new Person();
}
return person;
}
}
饿汉模式:类加载完成就创建对象
- 将构造器私有化。
- 私有静态属性中存放创建的对象,并且在类加载完成就创建好了。
- 提供一个公有的静态方法,获取之前对象变量。
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。
package im;
/**
* 饿汉模式
* @author MF
*
*/
public class Person2 {
private static Person2 person =new Person2();
private Person2() {
}
public static Person2 getPerson() {
return person;
}
}
线程安全版懒汉模式 利用synchronized作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。
package im;
import java.util.concurrent.locks.ReentrantLock;
public class Person3 {
private static volatile Person3 p;//保证了原子性,一致性
//private static ReentrantLock lock =new ReentrantLock();
private Person3() { System.out.println(5);
}
public static Person3 getPerson() {
if(p==null) {//如果对象存在,直接返回,不需要进行等待了,直接返回,效率高
synchronized (Person.class) {
if(p==null) {
p=new Person3();
}
/**
* 开辟空间 1
* 赋初始值 2
* 返回地址给变量p 3
*/
}
}
return p;
}
}
前几天被朋友说到,我的CSDN是在一直摸鱼,一周就更新一篇,内容还少。emmmmm,我不是咸鱼,好吧。接下来我会提高自己的更新量和文章水平的。