同步访问很慢

时间:2015-04-27 17:34:20

标签: java java-threads

我在很多线程之间共享一个列表。 线程所需的所有数据在它们开始之前都存在,我不会在列表中添加任何其他值。 每个踏板取一个列表中的值,从列表中删除值,并进行远程调用。 该块已同步。

    while (!contactList.isEmpty()) {

        Contact contact = null;

        synchronized (contactList) {

            if (!contactList.isEmpty()) {

                contact = contactList.get(0);
                contactList.remove(0);
            }
        }
        //call the service with contact
    }

有更有效的方法来完成这项工作吗?

目前,接受所有联系并将其拆分为多个单独的程序会更快。

1 个答案:

答案 0 :(得分:3)

如果您真的只想从列表前面提取元素并且想要确保它们在那里,那么您应该查看ConcurrentLinkedQueue。这也保证了O(1)的插入和删除,因为插入发生在队列的末尾,并且检索发生在它的头部而不需要向下移动元素。

由于您在输入此块之前声明数据存在,因此如果列表本身为空,则对poll的调用将仅返回null。从那里开始,您必须决定从队列中返回null的含义。

一个(非常粗略)的例子:

ConcurrentLinkedQueue<Contact> contactQueue = new ConcurrentLinkedQueue<>();
Contact contact = contactQueue.poll(); // will return null if empty