黑马程序员------java中可能出现的面试题(重点)
2013-11-07 20:17
363 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一.单例设计模式
* 单例设计模式的体现
* 需求:为了保证一个类在内存中只能够存在一个对象
* 方法步骤:
* 1、首先对此类构造函数进行私有化
* 2、构造函数私有化以后,外界就不能够创建对象了,那么只能在本类中自定义对象
* 3、想要外界访问到本类自定义对象的话,那么就需要提供访问方法
* 4、外界想要访问本类,因为不能够创建对象,所以必须通过类名.方法名的方式访问,那么本类中的方法就必须定义为static
* 5、因为本类中方法定义成了静态,而静态成员不能够访问非静态成员,所以对象也必须静态修饰
* 6、然后当调用了方法时,可以通过返回该类对象的方式获取到对象
* 7、然后定义一个变量进行接收
* 8、此时该变量的内存地址值就是s对象的内存地址值,指向堆内存中的new Single();
代码示例:
* 饿汉式与懒汉式比较
* 区别:
* 1、饿汉式是在类加载到内存时对象就已经创建了;饿汉式只有当调用了getInstance方法时才创建对象
* 2、懒汉式的特点是对象的延迟加载
*
*
* 重点:当懒汉式遭遇多线程运行时会出现问题
* 问题:当一个线程执行了if语句后,在这儿停下了,这时候另一个线程执行了if语句,
* 第一个线程这时候又开始运行,创建了一个对象,第二个线程继续运行,又创建了一个对象
* 这时候就不符合程序对象的唯一性了
* 解决办法:
* 1、把getInstance方法用synchronized修饰,这样虽然可以避免创建多个对象,可是存在弊端
* 每一个线程进来的时候都需要先判断锁是不是开着来,这样很耗费资源
*
* 最佳解决办法:
* 1、把线程所执行的共享数据if语句synchronized,因为getInstance语句是静态的,所以这时候的锁是Single1.class字节码文件
* 这样仍然存在弊端,因为每一个线程进来仍然需要判断锁的状态,这时候在synchronized语句上加上if(s==null),
* 这样的话当第一个线程执行到一半停止了,那么第二个线程进不去,当第一个线程执行完毕,第二个线程仍然进不去,后面所有的
* 线程都不需要读取锁的状态,这样节省资源
代码示例:
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
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
相关文章推荐
- Java面试题:高并发环境下,HashMap可能出现的致命问题。注意:是在jdk8以下版本
- 面试题43:n个骰子和出现可能值得概率(java)
- Java面试题:高并发环境下,HashMap可能出现的致命问题。注意:是在jdk8以下版本
- 黑马程序员_java面试题总结【2】(银行业务调度系统)
- 黑马程序员——JAVA 面试题交通灯管理系统
- JavaOne大会重点强调了移动和JavaFX,舍弃了JavaFX脚本(期待...强大java界面的出现)
- 应聘Java笔试时可能出现问题及其答案
- [转] 应聘Java笔试时可能出现问题及其答案(第十一部分)
- 剑指Offer面试题32(java版):从1到n整数中1出现的次数
- 黑马程序员——Java重点基础之多线程(二)
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 应聘Java笔试时可能出现问题及其答案
- 黑马程序员-----JAVA 7K月薪面试题:交通灯管理系统
- 解决:flash cs5运行时出现“java运行时环境初始化时出现错误,你可能需要重装Flash”
- 应聘Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题
- 有感应聘Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题及其答案(第二版 第一部分)
- JavaOne大会重点强调了移动和JavaFX,舍弃了JavaFX脚本(期待...强大java界面的出现)
- 应聘Java笔试时可能出现问题及其答案 (二)