您的位置:首页 > 职场人生

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

2013-11-07 20:17 363 查看
----------------------
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: