首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked locking)双重检查: 如果出于性能的考虑而需要对实例域(注意这个属性并没有被static修饰)使用延迟初始化,就使用双重检查模式 public class Singleton { private volatile Singleton uniqueInstance; private Singleton(){…
Lazy initialization - It decreases the cost of initializing a class or creating an instance, at the expense of increasing the cost of accessing the lazily initialized field. Depending on what fraction of lazily initialized fields eventually require i…
原文:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization#theCommentsSection 有很多知识点可以再延伸.消化一下. 双重锁定检查(Double Check Lock)这个词看上去有些摸不着头脑.但是如果你有兴趣看一下java框架的话,你可能会遇到这种代码(没错,就是我看到过).没事,先来看一下下面的这个例子. 线程不安全的单例模式 线程不安全的单例模式: package…
Lazy initialization (also sometimes called lazy instantiation, or lazy loading) is a technique for delaying the creation of an object or some other expensive process until it’s needed. When programming for iOS, this is helpful to make sure you utiliz…
DCL,即Double Check Lock,中卫双重检查锁定. [Java并发编程]之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码) 关于单例.关于DCL:Double Check Lock.关于volatile 单例模式.双检测锁定DCL.volatile Java内存模型之从JMM角度分析DCL 关于单例的DCL方式分析-…
Swift中是存在和OC一样的懒加载机制的,但是这方面国内的资料比较少,今天把搜索引擎换成了Bing后发现用Bing查英文\最新资料要比百度强上不少. 我们在OC中一般是这样实现懒加载初始化的: 1: @property (nonatomic, strong) NSMutableArray *players; 2:   3: - (NSMutableArray *)players { 4: if (!_players) { 5: _players = [[NSMutableArray alloc…
公司的一个项目,使用的nodejs做服务端,数据库是postgresql,在本地时一切ok,放在centos时,postgresql配置ok,可以远程访问,但是nodejs在centos启动时,就会报错,找不到postgresql服务,Error Msg如下: 09/14 10:00:27 - info: Error: Failed to find PostgresSQL server. Please double check your settings.at connectCallback (…
  最近被多线程问题(multi-thread issue)弄昏了头.以前虽然也知道系统里要考虑多线程问题,也无数次见到double-check的代码,但是由于自己碰到这方面的问题基本上就是从其他地方拷贝一份现成的代码,改吧改吧,也一直没有遇到多线程带来的bug,所以就没有留心.知道年前,一份两三个月前写的代码出现了由于多线程带来的bug,最近写的代码在code review中又被师兄批评没有考虑多线程问题,这才专门去补了补这方面的知识,现在就小结一下multi-thread问题以及在其中经常会…
Swift中是存在和OC一样的懒加载机制的,在程序设计中,我们经常会使用 懒加载 ,顾名思义,就是用到的时候再开辟空间 懒加载 格式: lazy var 变量: 类型 = { 创建变量代码 }() 懒加载的写法本质上是定义并执行一个闭包 // 含义: 当dataList被使用到时, 就会执行等号后面的闭包 // 所以等号后面的闭包的()是必须写的, 如果不写就会报错 // 注意点: 如果写懒加载, 那么修饰符必须用var lazy var dataList:[String] = { print(…
话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Lockin…
方法保证了多线程并发下的线程安全性.这里在声明变量时使用了volatile关键字来保证其线程间的可见性:在同步代码块中使用二次检查,以保证其不被重复实例化.集合其二者,这种实现方式既保证了其高效性,也保证了其线程安全性. package com.test; public class MyObject{ volatile private static MyObject instance; private MyObject() { } public static MyObject getInstan…
这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙地同时实现了延迟加载和线程安全. 1.相应的基础知识 什么是类级内部类? 简单点说,类级内部类指的是,有static修饰的成员式内部类.如果没有static修饰的成员式内部类被称为对象级内部类. 类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建.而对象级内部类的实例,是绑定在外部对象实例中的. 类级内部类中,可以定义静态的方法.在静态方法中只能够引用外部类中的静态成员方法或者成员…
普通单例模式Demo public class Demo{ private static Demo INSTANCE; private Demo(){} public static Demo getInstance(){ if(INSTANCE==null){ // 饿汉式单例 INSTANCE=new Demo(); } return INSTANCE; } } 上面单例实现方式在单线程访问下没有问题,但是在并发访问时,会产生多个对象. 如程序启动 A线程获取INSTANCE执行完if判断为n…
[单件类] 保证只能有一个实例化对象,并提供全局的访问入口. [设计注意事项] 1.阻止所有实例化的方法: private 修饰构造函数,赋值构造函数,赋值拷贝函数. 2.定义单实例化对象的方法: a.使用static 修饰 b.使用new+delete的方法 3.多线程版本: 使用双检测锁定,即先检测单实例对象是否存在:不存在,使能"锁",再次判断实例是否存在,不存在就创建该单实例对象. A.单层锁示例: Singleton* Singleton::getInstance() { L…
http://www.cnblogs.com/limingluzhu/p/5156659.html http://blog.csdn.net/chenchaofuck1/article/details/51702129…
Principle Never derive a value associated with an enum from its ordinal; store it in an instance field instead. Bad practice Demo // Abuse of ordinal to derive an associated value - DON'T DO THIS public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUIN…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 83. 明智谨慎地使用延迟初始化 延迟初始化(Lazy initialization)是延迟属性初始化直到需要其值的行为. 如果不需要该值,则永远不会初始化该属性. 此技术适用于静态和实例属性. 虽然延迟初始化主要是一种优化,但它也可以用来打破类和实例初始…
78.  同步访问共享的可变数据 为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的. 不共享可变的数据.要么共享不可变的数据,要么压根不共享.换句话说,将可变数据限制在单线程中. 当多个线程共享可变数据的时候,每个读或写数据的线程必须执行同步.如果没有同步就无法保证一个线程所做的修改被另一个线程获知.如果只需要线程间的交互通信而不需要互斥,volatile是一种可以接受的同步形式.   这个在工作中也需要注意,在学习完多线程编程之后更好理解. 79.  避免过度同步 过度同步可能会导致…
Chapter 10 Concurrency Item 66: Synchronize access to shared mutable data synchronized这个关键字不仅保证了同步,还保证了可见性(visibility). 对于变量的读写是原子性的,除非变量类型是long或double.有一个我见过无数遍的例子就是设一个共享的boolean变量,然后从一个线程中断另一个线程的while循环.因为JVM会做优化,但它做优化的前提是假设下面这些代码都是在单线程下运行的,比如可能把wh…
Num1:同步访问共享的可变数据 关键字Synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块.. 同步不仅仅理解为互斥的方式,如果没有同步,一个线程的变化就不能被其他线程看到.同步不仅可以阻止一个线程看到对象处于不一致的状态中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前的所有修改效果. 基本版本: public class StopThread { private static boolean stopRequested;…
一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导致结果不正确. 3.尽量将可变数据限制在单个线程中. 4.多个线程共享可变的数据时,每个读或者写数据的线程都必须同步. 二.避免过度同步 1.在同步的方法或者代码块中,注意多态等级制引入的客户端的外来输入,要保证其没有破坏同步机制和造成死锁. 2.尽量把对外来方法的调用移动到同步区域之外. 3.在同…
前言 此篇讲到的是图片上传功能,每个网站必定会有这样类似的功能,上传文件.上传图片等等.那么接下来,看看我们EF+uploadfile+ftp如何玩转上传图片吧 效果预览 具体实现 一个简单数据库 只有一个主键Id,一个身份证正面路径和一个身份证背面路径三个字段. 首先呢,我们把实体类新建好如下: public class ImageModel:BaseEntity { /// <summary> /// 用户Id /// </summary> public int ID { ge…
1.大多数情况下,正常的初始化要优先于延迟初始化. private final FieldType field = computeFieldValue(); 2.如果利用延迟优化来破坏初始化的循环,就要使用同步访问方法,因为它是最简单.最清楚的替代方法. private FieldType field; synchronized FieldType getField(){ if(field == null){ field = computeFieldValue(); } return field…
Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query.OrderBy(x=>x.GetType().GetField().Take(); 上面的写法是无法编译通过的,此路不通,于是找到一个order扩展类: using System; using System.Linq; using System.Linq.Expressions; using Syst…
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Linq.Dynamic; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace…
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _in…
第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static Singleton _instance = null;    private Singleton(){}    public static Singleton CreateInstance()    {        if(_instance == null) {            _instance = new…
权限分配和权限查找. 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:AggreateRoot { private IRepository<BAS_PermissionAssgin> irepository; public BAS_PermissionAssgin(IRepository<BAS_PermissionAssgin> irepository) { this…
单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } 第…