【问题标题】:How to maintain a pool of names?如何维护名称池?
【发布时间】:2010-04-27 06:15:34
【问题描述】:

我需要维护一个用户 ID(代理帐户)列表,该列表将分发给多线程客户端。基本上,客户端将使用用户标识来执行操作;但是对于这个问题,这些动作是什么并不重要。当客户端获得用户 ID 后,其他客户端将无法使用该用户 ID,直到操作完成。

我正在尝试考虑一个并发数据结构来维护这个用户 ID 池。 有任何想法吗 ? ConcurrentQueue 会完成这项工作吗?客户端将出列用户 ID,并在完成后添加回用户 ID。

【问题讨论】:

    标签: java multithreading oop concurrency


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您真的需要有限的用户 ID 池吗?否则,每个用户都可以简单地拥有一个递增的用户 ID。这样,就没有碰撞的风险,而且对我来说似乎更容易。

      【讨论】:

      • 即使用户 id 不需要被重用,很可能 id 冲突是不可接受的。
      • 可用用户标识集由单独的第 3 方系统专门管理。我别无选择。
      【解决方案3】:

      我会使用BlockinQueue

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

      【讨论】:

        【解决方案4】:

        BlockingQueue 合适吗?如果 Queue 为空,应该采取什么措施?听起来您可能与第三方软件的连接数量有限。在这种情况下,您可能希望向任何无法获取用户 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);
            }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-18
          • 1970-01-01
          • 2011-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多