错了,应该是现在问题是:
如果同时有两个线程A,B,同时到(1),A先执行getHelper(),B等待,等A执行完以后,到B,但是为什么他会因为因为helper已经以为线程A执行过后helper已经不为null,所以(2)根本不执行
能不能给我分析一下为什么,我认为在jvm中,他能根据多个线程能产生多个helpers实例,以为helper毕竟不是static,所以线程A,B执行过程中他们的各自helper不会影响对方
如果同时有两个线程A,B,同时到(1),A先执行getHelper(),B等待,等A执行完以后,到B,但是为什么他会因为因为helper已经以为线程A执行过后helper已经不为null,所以(2)根本不执行
能不能给我分析一下为什么,我认为在jvm中,他能根据多个线程能产生多个helpers实例,以为helper毕竟不是static,所以线程A,B执行过程中他们的各自helper不会影响对方
解决方案 »
- 关于java登陆界面
- newInstance为啥抛出IllegalArgumentException错误,求解决方法
- 问个问题,几个版块都问了无人能解答。在jboos中通过addurl远程部署程序无法成功问题
- JAVA 的LIST使用过程中NULL和SIZE=0谁最优
- JPanel画图问题
- 非常简单的java题目 !!帮帮忙~~!!
- java.awt.component的repaint()、update()有什么区别呢
- 请问有没有关于使用JCreator的教程,谢谢!30分
- JAVA 求大神指教 如何排版~~~~~~~~~
- 请问用JB8打包成EXE文件,怎么引用第三方的jar文件啊
- 请问hashset,hashtable,hashmap有什么区别?
- 关于内部类的错误!我块疯了!大家要救我!
所以楼主的(1)部分加入static声明,getHelper()也加入static声明试试看。否则你的类每次调用都要实例化才能执行getHelper(),这和单例的思想是矛盾的啊。
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 );
}
}楼主,这才是单例模式。
foo f2 = new foo();你试试看Thread1调用f1,Thread2调用f2,再试试Thread1、Thread2都调用f1有什么不同如果还不明白,那…………看书吧,呵呵。
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是同一块内存,所以,先查查程序,看看是不是这样。