,为什么需要两次if判断才进行初始化对象
第一次if判断主要是为了减少性能开销,之所以这么说,如果不加第一个if判断,每次进入getInstance()方法,synchronized关键字会将整个代码进行锁住...,加锁操作,在进行判断是否已经初始化,在进行释放锁,加锁和释放锁是有较大的性能开销,所以在最外层包裹一层if判断实例是否被初始化,这样就不会每次加锁和释放锁了
既然synchronized锁增加了性能开销...,为什么要加锁呢
当然在单线程情况下,是没有必要加锁,而多线程情况下,多个线程同时进行初始化对象操作,这样就会有线程安全性问题,为了防止这种情况,我们需要使用synchronized,这样该方式在多线程情况下就是线程安全的...,大致可以分为以下几步:
1.创建对象并分配内存地址
2.调用构造器方法,执行初始化对象
3.将对象的引用地址赋值给变量
在多线程情况下,上面三个步骤可能会发生指令重排(在一些JIT编译器中),编译器或处理器会为了提高代码性能效率...上面三个步骤2和3之间可能会发生重排,但是1不会,因为2和3是要依托1指令的执行结果,才能继续往下走:
1.创建对象并分配内存地址
2.将对象的引用地址赋值给变量
3.调用构造器方法,执行初始化对象
Java