我有具有表(哈希图)的单例对象(类)。所有其他对象(客户端)将读取存储在表内的其他客户端列表。使用该表的所有方法均已包含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);


AppNetowrkLogicAppInterface单例内部的对象,它是创建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;
}

09-05 02:48