我有具有表(哈希图)的单例对象(类)。所有其他对象(客户端)将读取存储在表内的其他客户端列表。使用该表的所有方法均已包含synced关键字。我已经调试了表对不同客户端具有不同值的情况。客户端可能在或可能不在同一线程上运行,这就是为什么我添加了synced关键字的原因。
这是使用哈希图的方法:
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;
}
最佳答案
就像我怀疑的那样,在多个客户端访问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;
}