- //假设存在两个线程A和B
- public class Single
- {
- private static Single s= null;
- private Single(){}
- public static Single getInstance()
- {
- if(s==null)
- { //2.由于A线程没有执行到s=new Single();所以没有新对象创建,可以通过这个s==null的判断。
- //但是由于同步代码块的关系,A没有放锁,所以B无法执行同步代码块。只能等待
- synchronized(Single.class)
- {//1。A线程运行到这个位置,失去了执行权,执行权由B获得
- if(s==null)//4.如果A执行完同步代码块后失去执行权,则B可以继续执行,并进入同步代码块,
- //但是由于新对象已经被创建,这时s==null的判断为false,结束同步代码块,并执行return s;语句。
- {
- s=new Single();//3.如果A重新获取执行权,运行完同步代码块,就创建了新对象s= newSingle();
- }
- }
- }
- return s;
- }
- }
复制代码 这是我笔记上自己加的注释,按照注释的序号顺序,个人感觉还算比较好理解。希望能帮到你。 |