当前位置: 首页 > 面试题库 >

在Java中同步ArrayList的正确方法

姬向明
2023-03-14
问题内容

我不确定这是否是同步我的的正确方法ArrayList

我有一个ArrayList in_queueregisterInQueue函数传递过来的。

ArrayList<Record> in_queue = null;

public void registerInQueue(ArrayList in_queue)
{
    this.in_queue = in_queue;
}

现在,我正在尝试使其同步。这是否in_queue正确同步了我的对象?

List<Record> in_queue_list = Collections.synchronizedList(in_queue);

synchronized (in_queue_list) {
    while (in_queue_list.size() > 0) {
        in_queue_list.remove(0);
    }
}

问题答案:

您要进行两次同步,这是没有意义的,可能会减慢代码的速度:在列表上进行迭代时所做的更改需要整个操作的同步,在这种情况下,synchronized (in_queue_list)使用Using
这样做Collections.synchronizedList()是多余的(它创建了一个包装程序来同步各个操作)。

但是,由于您要完全清空列表,因此迭代删除第一个元素是最糟糕的方法,因为每个元素都必须复制所有后续元素,这使其成为O(n ^ 2)操作-
非常可怕对于较大的列表,速度较慢。

相反,只需调用clear()-无需迭代。

编辑: 如果您以后需要单方法同步Collections.synchronizedList(),那么这是正确的方法:

List<Record> in_queue_list = Collections.synchronizedList(in_queue);
in_queue_list.clear(); // synchronized implicitly,

但是在很多情况下,单方法同步是不够的(例如,对于所有迭代,或者当您获得一个值时,都基于该方法进行计算,然后将其替换为结果)。在这种情况下,无论如何,您都必须使用手动同步,因此html" target="_blank">Collections.synchronizedList()无用的额外开销。



 类似资料:
  • null my Library的核心逻辑 客户将使用我们的库,他们将通过传递builder对象来调用它。然后,我们将通过使用对象构造一个URL,并通过执行该对象对该URL进行HTTP客户端调用,在将响应作为JSON字符串返回后,我们将通过创建对象将该JSON字符串按原样发送给客户。有些客户会调用,有些可能会调用方法,所以我需要在库中分别提供两个方法。 接口: 您将如何实现同步和异步方法给定上述标准

  • 问题内容: 在查看golang内存模型文档(link)时,我发现go lang上有一个奇怪的行为。该文档说,下面的代码可能会发生,g依次打印2和0。 这是例行公事吗?因为我很好奇为什么变量’b’的值赋值可以先于’a’赋值?即使’a’和’b的值分配将在不同的线程中发生(不在主线程中),是否也必须确保在其自己的线程中将’a’分配在’b’之前?(因为分配’ a’首先出现,’b’之后出现)有人可以清楚地告

  • 问题内容: 因此,我正在考虑建立一个业余项目,这只是为了完成我的编程/设计。 它基本上是一个多线程的网络蜘蛛,更新了相同的数据结构object-> int。 因此,为此使用数据库绝对是矫kill过正,而我唯一想到的就是用于包含我的数据结构的线程安全单例。http://web.archive.org/web/20121106190537/http://www.ibm.com/developerwor

  • 那么,回到问题上来,鉴于微软建议不要在新的开发中使用WebRequest而是使用只提供异步API的HttpClient,我该怎么办呢? 这是我正在做的一些伪代码... 如何实现ProcessStuff()?

  • 问题内容: 我正在为MongoDB使用Node.JS驱动程序,我想执行一个同步查询,例如: 问题是,db.open是一个异步调用(它不会阻塞),因此getAThing返回“ undefined”,我希望它返回查询结果。我确定我可以使用某种阻止机制,但我想知道执行此类操作的正确方法。 问题答案: 没有办法使这种同步变得不可怕。正确的方法是接受回调函数作为参数,然后在可用时调用该函数。 节点7.6+更

  • 假设我在某个类上有一个同步方法: 我在不使用同步修饰符的情况下覆盖了它: 关于这个场景,我有几个具体的问题: 重写的方法也会隐式同步吗? 如果没有,-call会同步吗? 如果没有-call,会同步任何东西吗? 有没有办法强制覆盖方法使用(我注意到抽象方法定义或接口内的方法定义不允许同步关键字)?