西安网站建设动力无限移动关闭流量自动续费
西安网站建设动力无限,移动关闭流量自动续费,浏览器无法跳转二级页面,网站优化北京哪家强?1 概述
单例模式就是保证一个类只有一个对象实例。 为了保证无法创建多余的对象实例#xff0c;单例类中需要自己创建对象实例#xff0c;并把自己的构造方法私有化以防止其他地方调用创建对象#xff0c;且需要提供一个公共的方法给其他类来获取该单例类的实例。 同时单例…1 概述
单例模式就是保证一个类只有一个对象实例。 为了保证无法创建多余的对象实例单例类中需要自己创建对象实例并把自己的构造方法私有化以防止其他地方调用创建对象且需要提供一个公共的方法给其他类来获取该单例类的实例。 同时单例类还可以减少对象的创建与销毁所消耗的时间及性能
2 懒汉式非线程安全
public class SingleObject {private static SingleObject instance;private SingleObject() {}public static SingleObject getInstance() {if (instance null) { //1instance new SingleObject();}return instance;}
}当其他类来调用getInstance方法获取对象实例时才判断对象是否创建如果对象没有创建则创建一个对象并返回如果对象已经创建则直接返回。 之所以叫做懒汉式是因为该方式将对象的初始化工作放到了使用的时候。 这个方式是非线程安全的因为假设线程a执行到注释1处判断对象是否等于null此时为true那么会继续执行new对象的操作但在这个操作之前发生了线程切换线程b也会判断对象为null然后new一个对象当线程切换回线程a时线程a也会new一个对象从而导致创建了两个对象两个线程获得的也是两个不同的SingleObject对象。
3 懒汉式线程安全
public class SingleObject {private static SingleObject instance;private SingleObject() {}public static synchronized SingleObject getInstance() {if (instance null) {instance new SingleObject();}return instance;}
}在上面的基础上加上synchronized 关键字使之成为同步方法。但同步锁是一个重量级的锁每次获取单例的时候都加锁会带来性能开销。
4 恶汉式线程安全
public class SingleObject {private static final SingleObject INSTANCE new SingleObject();private SingleObject() {}public static SingleObject getInstance() {return INSTANCE;}
}类初始化时就创建单例对象由于调用中没有new操作所以无法操作该单例对象所以线程安全。 改方式的缺点就是类初始化的时候就创建对象在使用前该对象一直占用着内存会形成内存的无效占用。
5 双重校验锁线程安全
public class SingleObject {private volatile static SingleObject instance;private SingleObject() {}public static SingleObject getInstance() {if (instance null) {synchronized (SingleObject.class) {if (instance null) {instance new SingleObject();}}}return instance;}
}instance使用volatile修饰保证可见性和禁止指令重排。 双重检测instance是否为null第一层检测如果不为null则直接返回避免了懒汉式线程安全的每次获取实例都需要加锁的消耗。如果为null则加锁创建对象实例。 为什么要使用volatile关键字修饰instance 因为如果不使用volatile多线程时在虚拟机优化——指令重排的情况下可能会导致线程获取的实例没有初始化。 new和赋值操作在JVM的指令中时4个指令第一条是类的实例创建指令会返回一个引用到操作数栈的栈顶第二条指令是将栈顶复制一份并存入栈顶第三条指令是调用构造方法第四条指令则是给静态字段赋值。 第三条和第四条指令是可能出现指令重排的如果第四条指令先执行则此时instance就不为null了有了指向对象的指令。但是由于第三条指令没有执行改对象却没有初始化。如果出现指令重排就可能出现有线程获取到没有初始化的对象并使用该对象进行一些操作。
6 静态内部类线程安全
public class SingleObject {private static class SingleInner {private static final SingleObject INSTANCE new SingleObject();}private SingleObject() {}public static SingleObject getInstance() {return SingleInner.INSTANCE;}
}由于内部类声明为private的在SingleObject外无法访问所以除了内部类中创建的对象无法在其他地方创建对象。 这种方式也是延迟初始化的因为只有调用getInstance方法时才会导致SingleInner类加载初始化并创建对象。
7 枚举线程安全
public enum SingleObject {INSTANCE;public void testMethod() {System.out.println(test);}
}利用枚举类的特性只定义一个枚举类对象那么这个枚举类就自然的是单例类了。 同时通过枚举类实现还有以下好处自动支持序列化能够防止反序列化时创建对象。 该方式是最推荐的方式
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90249.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!