我有一个包含表(hashmap)的单例对象(类)。所有其他对象(客户端)读取存储在表中的其他客户端的列表。使用该表的所有方法都使用synchronized关键字包围。我调试了一个表,其中表具有不同客户端的不同值。客户端可能会也可能不会在我添加synchronized关键字的同一个线程上运行。
这是使用hashmap的方法:
public synchronized Client addToConnectedClients(long key, Client client)
{
return allConnectedClients.put(key, client);
}
public synchronized Client getFromConnectedClients(long key)
{
return allConnectedClients.get(key);
}
public synchronized Client removeFromConnectedClients(long key)
{
return allConnectedClients.remove(key);
}
这是我如何从客户端对象内部访问表:
Client temp=AppInterface.getInstance().getAppNetworkLogic().getFromConnectedClients(key);
AppNetowrkLogic
是AppInterface
单例内的一个对象,它是在创建AppInterface
时的。
我不知道这是怎么发生的。
编辑:
这是getInstance
方法:
private static AppInterface instance=null;
public static AppInterface getInstance()
{
if(instance == null)
{
instance= new AppInterface();
}
return instance;
}
答案 0 :(得分:1)
就像我怀疑的那样,在多个客户访问getInstance
的竞争条件下,可能会出现竞争条件,并且可以创建多个AppInterface
。
要么急切地创建AppInterface
private static AppInterface instance=new AppInterface();
public static AppInterface getInstance()
{
return instance;
}
或同步对AppInterface
private static AppInterface instance=null;
public static AppInterface getInstance()
{
synchronized(AppInterface.class) {
if(instance == null)
{
instance= new AppInterface();
}
}
return instance;
}