日期:2014-05-18  浏览次数:20743 次

java高手来看看啊
private   static   Configurator   MyInstance;

private   static   Object   lock=new   Object();

private   Properties   props;

public   static   Configurator   getInstance(){
if(MyInstance==null){
synchronized(lock){
if(MyInstance==null){
MyInstance=new   Configurator();
}
}
}
return   MyInstance;
}  
这段代码怎么先有了个if(MyInstance==null),后面在同步里面还有判断啊

还有synchronized(lock)和this   有什么区别么

------解决方案--------------------
i don 't know !
------解决方案--------------------
首先要明确一点,这段代码肯定是出现在一个单例模式下,单例就是说一个类只能有一个实例,无论何时,所有获得的这个类的实例都是同一个对象。明白了这一点,让我来给你解释这个问题。
1.两个if的问题。
外层if的作用是判断目前这个类的实例是否已经存在,也就是说MyInstance是否已经引用了一个实例,如果已经存在,则将这个实例返回,否则去执行if语句体中的代码来生成这个实例。出于效率的考虑,我们应该允许几个线程同时获得这个实例,所以并没有为在这个if加上synchronized。
但是,当这个类的唯一的实例还没有被创建的时候、我们执行if体内的代码来创建一个实例时,如果这以过程被几个线程并发执行的话,就会同时出现几个实例了!所以,我们要为这段代码加上synchronized来阻止并发。
总结:其实简单说就是这样的,当我们需要获得这个类的实例时,如果实例已经存在,则直接获得,可以多个线程并发;如果实例不存在,则需要“排队”,排在第一个的创建实例,排在后面的发现这个实例已经被创建了(就是那个排在第一个的创建的),就不再创建。
2.object与this。
你所写的只是类中的一部分代码,也许还有其它代码。我们用object来做并发锁对象,可以实现只针对这一语句来进行并发控制。如果使用this,则会出现一下不良情况:
如果有一段语句或函数与我们的当前代码没有并发冲突,但却都使用this做并发锁,那么当它处于运行状态时,我们在调用这段代码时就必须等待,直到那段代码执行完我们才可以继续。影响效率。