黑马程序员------java中可能出现的面试题(重点)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

一.单例设计模式

* 单例设计模式的体现
 * 需求:为了保证一个类在内存中只能够存在一个对象
 * 方法步骤:
 * 1、首先对此类构造函数进行私有化
 * 2、构造函数私有化以后,外界就不能够创建对象了,那么只能在本类中自定义对象
 * 3、想要外界访问到本类自定义对象的话,那么就需要提供访问方法
 * 4、外界想要访问本类,因为不能够创建对象,所以必须通过类名.方法名的方式访问,那么本类中的方法就必须定义为static
 * 5、因为本类中方法定义成了静态,而静态成员不能够访问非静态成员,所以对象也必须静态修饰
 * 6、然后当调用了方法时,可以通过返回该类对象的方式获取到对象
 * 7、然后定义一个变量进行接收
 * 8、此时该变量的内存地址值就是s对象的内存地址值,指向堆内存中的new Single();

代码示例:

//饿汉式
public class Dan_li_she_ji {
	public static void main(String[] args) {
		
		Single s1 = Single.getInstance();
		s1.setName("张三");
		System.out.println(s1.getName());
		
		Single s2 = Single.getInstance();  //这并没有创建对象,而是定义了一个新的变量,所指向的仍然是s对象
		s2.setName("李四");   //s2更改了name的值,那么s1、s2访问到得name值都是“李四”
		System.out.println(s1.getName());  //现在s1、s2内存地址值一样,所指向的对象都为s
		System.out.println(s2.getName());
	}
}

class Single{
	private String name;
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	
	private Single(){}
	private static final Single s = new Single();
	
	public static Single getInstance(){
		return s;
	}
}

//懒汉式
class Single3{
	private Single3(){}
	private static Single3 s = null;
	
	public static Single3 getInstance(){
		if(s==null){
			s = new Single3();
		}
		return s;
	}
}


* 饿汉式与懒汉式比较
 * 区别:
 * 1、饿汉式是在类加载到内存时对象就已经创建了;饿汉式只有当调用了getInstance方法时才创建对象
 * 2、懒汉式的特点是对象的延迟加载
 * 
 * 
 * 重点:当懒汉式遭遇多线程运行时会出现问题
 * 问题:当一个线程执行了if语句后,在这儿停下了,这时候另一个线程执行了if语句,
 * 第一个线程这时候又开始运行,创建了一个对象,第二个线程继续运行,又创建了一个对象
 * 这时候就不符合程序对象的唯一性了
 * 解决办法:
 * 1、把getInstance方法用synchronized修饰,这样虽然可以避免创建多个对象,可是存在弊端
 * 每一个线程进来的时候都需要先判断锁是不是开着来,这样很耗费资源
 * 
 * 最佳解决办法:
 * 1、把线程所执行的共享数据if语句synchronized,因为getInstance语句是静态的,所以这时候的锁是Single1.class字节码文件
 *    这样仍然存在弊端,因为每一个线程进来仍然需要判断锁的状态,这时候在synchronized语句上加上if(s==null),
 *    这样的话当第一个线程执行到一半停止了,那么第二个线程进不去,当第一个线程执行完毕,第二个线程仍然进不去,后面所有的
 *   线程都不需要读取锁的状态,这样节省资源

代码示例:

public class Dan_li_she_ji_bijiao {

}

//饿汉式
class Single1{
	private Single1(){}
	private static final Single1 s = new Single1();
	
	public static Single1 getInstance(){
		return s;
	}
}

//懒汉式(延迟加载的单例设计模式)
class Single2{
	private Single2(){}
	private static Single2 s = null;
	
	public static Single2 getInstance(){
		if(s==null){
			synchronized(Single2.class){
				if(s==null){
					s = new Single2();
				}
			}
		}
		return s;
	}
}

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值