java synchronized和shared tables

时间:2015-01-25 02:38:20

标签: java multithreading synchronized volatile

我有一个包含表(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);

AppNetowrkLogicAppInterface单例内的一个对象,它是在创建AppInterface时的。

我不知道这是怎么发生的。

编辑: 这是getInstance方法:

private static AppInterface instance=null;
public static AppInterface getInstance()
{
    if(instance == null)
    {
        instance= new AppInterface();
    }
    return instance;        
}

1 个答案:

答案 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;        
}