错了,应该是现在问题是:
如果同时有两个线程A,B,同时到(1),A先执行getHelper(),B等待,等A执行完以后,到B,但是为什么他会因为因为helper已经以为线程A执行过后helper已经不为null,所以(2)根本不执行
能不能给我分析一下为什么,我认为在jvm中,他能根据多个线程能产生多个helpers实例,以为helper毕竟不是static,所以线程A,B执行过程中他们的各自helper不会影响对方

解决方案 »

  1.   

    所谓单例模式就是要保证在内存中只有一个实例,所以其实例的声明应该是static的。同时为了保证其不被随便实例化,通常的做法是提供私有的构造方法,通过一个静态工厂方法调用这个私有的构造方法实现实例化。
    所以楼主的(1)部分加入static声明,getHelper()也加入static声明试试看。否则你的类每次调用都要实例化才能执行getHelper(),这和单例的思想是矛盾的啊。
      

  2.   

    package com.zt.language;import com.zt.util.*;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.jdom.*;/**
     * <p>Title: 国际化组件</p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author
     * @version 1.0
     */public final class Language
    {
        private static final Language language = new Language();    private Map map;    private Language()
        {
            map = new HashMap();
            Document doc = SystemUtil.createXMLDocument( getClass().getResourceAsStream( "/language.xml" ) );
            List list = doc.getRootElement().getChildren();
            for( int i = 0 , iCount = list.size() ; i < iCount ; i++ )
            {
                Element element = ( Element )list.get( i );
                map.put( element.getAttributeValue( "name" ) , element.getAttributeValue( "encode" ) );
            }
        }    public static Language getInstance()
        {
            return language;
        }    public String getEncode( String country )
        {
            return ( String )map.get( country );
        }
    }楼主,这才是单例模式。
      

  3.   

    我知道这不是单例模式,我只是在研究单例模式是看到这个例子,想来研究一下java的运行机制,原理,所以能给我解决一下吗
      

  4.   

    因为你调用的是同一个foo实例比如foo f1 = new foo();
        foo f2 = new foo();你试试看Thread1调用f1,Thread2调用f2,再试试Thread1、Thread2都调用f1有什么不同如果还不明白,那…………看书吧,呵呵。
      

  5.   

    如果同时有两个线程A,B,同时到(1)----------这种情况不会出现的在先程可以访问你这个class之前,1这个地方肯定已经执行过了
      

  6.   

    1.我想楼主应该明白什么样是典型的GOF单例模式。
    2.如果1不成立,不用再看下一条了。
    3.楼主写的例子典型的不是单列模式。
    4.楼主class用的foo就是说凡是调用getHelper()必须先new foo()实例,再用foo.getHelper()。
    5.请保证A,B两个线程没有使用同一个foo实例,很显然如果A,B用同一个foo实例的话,(B)一定不能再产生Helper了,因为foo.helper已经被(A)赋值过了。
    6.如果A, B两个线程真的没有用同一个foo实例,在jvm对象池中很可能两个foo还是同一个(见fligtweight模式),从现在的情况来看,两个实例的helper是同一块内存,所以,先查查程序,看看是不是这样。
      

  7.   

    对,我意思就是两个线程使用不同的foo实例
      

  8.   

    我刚刚试了一下,如果你的两个线程用的是不同的foo就会生成两个不同的Helper,不知你的代码是不是有什么问题。把它贴出来看看吧。