---------------------- 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