如何维护一个名字池?

时间:2010-04-27 06:15:35

标签: java multithreading oop concurrency

我需要维护一个userid(代理帐户)列表,这些列表将被抛弃到多线程客户端。基本上客户端将使用用户标识来执行操作;但是对于这个问题,这些行动是什么并不重要。当客户端获取用户标识时,在操作完成之前,其他客户端无法使用它。

我正在考虑使用并发数据结构来维护这个用户标识池。 有任何想法吗 ? ConcurrentQueue会做这个工作吗?客户端将使用户标识出列,并在完成后再添加用户标识。

4 个答案:

答案 0 :(得分:2)

对于类似情况,我实施了自己的BlockingQueue。只要您跟踪id池,就可以在适当的时候关闭队列。

答案 1 :(得分:0)

您真的需要有限的用户群吗?否则,每个用户只能有一个递增的用户ID。这样,就没有碰撞的风险,对我来说似乎更容易。

答案 2 :(得分:0)

我会使用BlockinQueue

这将使客户端线程能够轮询id(直到超出一个可用或时间限制)并在使用后将其推回。

答案 3 :(得分:0)

BlockingQueue合适吗?如果队列为空,应该采取什么行动?听起来您可能与第三方软件的连接数量有限。在这种情况下,您可能希望向无法获取用户ID的任何用户显示解释性消息。在这种情况下,阻塞将没有用。您可以围绕标准队列实现一些同步,并根据需要处理空队列。像这样的东西?

public class UserIDQueue {
private static final Queue<String> USER_IDS = loadUserIDs();
private static final Object USER_ID_LOCK = new Object();

//doesn't need to be synchronized as it is called at class load time
private static Queue<String> loadUserIDs() {
    Queue<String> userIDs = new LinkedList<String>();
    for(String userID : THIRD_PARTY_USER_IDS) {
        userIDs.add(userID);
    }
    return userIDs;
}

public static String getNextUserID() {
    synchronized(USER_ID_LOCK) {
        String userID = USER_IDS.poll();
        if (userID == null) {
            //not sure what your logic is, probably an exception
        }
        return userID;
    }
}

public static void returnUserID(String userID) {
    synchronized(USER_ID_LOCK) {
        USER_IDS.add(userID);
    }
}

}