单例模式懒汉和饿汉,以及终极版懒汉

单例懒汉模式和饿汉模式,以及线程安全版懒汉模式

单例模式:是一种常见的设计模式,一个类只能创建出一个实例对象,这就是单例模式写法(封装)。

封装:就是对复杂事物的一种简化。可以说是对具有相同特征的一类事物进行抽象封装,抽象程度越高,封装就越彻底。这样有助于建立各个系统之间的低耦合关系,提高系统的独立性。其实封装并不是一种技术,而是一种思想。当一件事变得复杂,就需要从一个更高的层次来进行管理。
懒汉模式:在调用静态方法时才能创建对象
  1. 将构造器私有化。
  2. 一个静态私有属性存放当前类常量的对象变量。
  3. 提供一个公有的静态方法,获取到之前对象变量。
    懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的
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;
  }

}

饿汉模式:类加载完成就创建对象
  1. 将构造器私有化。
  2. 私有静态属性中存放创建的对象,并且在类加载完成就创建好了。
  3. 提供一个公有的静态方法,获取之前对象变量。
    饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。
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,我不是咸鱼,好吧。接下来我会提高自己的更新量和文章水平的。

你可能感兴趣的:(笔记,学习学习,Java,java,设计模式)