镇江房地产网站建设网站策划模板
镇江房地产网站建设,网站策划模板,wordpress分享缩略图不显示,wordpress能不能做企业网站单例模式#xff08;Singleton#xff09;#xff1a;指在一个系统中某个类只存在一个实例#xff0c;类中自行实例化#xff0c;实例向该系统提供统一的访问接口。 单例模式有两种表现形式#xff0c;饿汉式#xff1a;类加载时#xff0c;就进行实例化#xff1b;懒…单例模式Singleton指在一个系统中某个类只存在一个实例类中自行实例化实例向该系统提供统一的访问接口。 单例模式有两种表现形式饿汉式类加载时就进行实例化懒汉式第一次引用类时才进行实例化。 饿汉式代码如图1所示我们以日志记录器类为例进行说明。 在类加载时logger会被初始化。图1中第6行代码私有了构造方法保证不被外部代码直接实例化。由于构造函数私有该类无法被继承。通过getInstance方法获得实例实例再通过info方法统一操作日志文件。 懒汉式 图2中9—11行在多个线程同时在这一区块临界区执行时由于线程的走走停停特性可能会得到多个实例。例如线程一刚好执行完图2第9行代码此时由于分配给线程一的时间片用完轮到线程二执行图2中第9行代码后假如又执行了第10行代码而后线程一得到了时间片可以继续执行第10行代码这时就会存在两个logger对象。
解决方式一如图3可以解决多线程问题然而所有线程会排队等锁这就意味着每次调用getInstance方法时都需要获取锁才会执行这对调用方可能有影响。 解决方式二如图4第4行静态变量logger被volatile修饰能保证各个线程中访问logger时的一致性即如果线程一修改了logger的值其它线程在访问logger变量的值时会得到修改后的值。但是如果不加图4中第10—11、13—14行代码也同样会面临图2中遇到的问题会创建多个logger实例。因此当多个线程在执行图4中10—14行代码是只有第一个线程可以进入创建完实例后离开而后在排队等待锁的第二个线程获得锁进入10—14行代码块此时因为volatile关键字的作用线程二访问到的logger变量已经不为空因1113行代码对logger进行了判断就不会再创建新的实例。在排队等待锁的第三、四、…等线程情况与第二线程类似此时如果再有线程进入getInstance方法图4中的第9、15行将会判断logger是否为空如果不为空就不会去排队等待进入10—14行代码的锁这样后面的线程在执行gelInstance方法时的速度就会得到提高而不会引起调用方阻塞。 使用场景唯一序列只能允许一个线程访问如计数器确保线程安全创建一个对象需要消耗的资源多如写日志等。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90367.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!