Java 支持多线程的arraylist

Java 支持多线程的arraylist,java,arraylist,Java,Arraylist,我需要将arraylist写入文件。 它总是被填满,当它变得太大时,我需要开始写它 所以我想检查arraylist sise何时大于100,然后追加文件并写入当前行。 但问题是有时它在几分钟内没有被填充,我想将数据转储到一个文件中。 因此,我的第二个想法是让另一个线程每隔几秒钟检查一次是否有行,并将其转储到文件中。 但是,我需要管理线程之间的锁 我的问题是: 1.多线程设计正常吗? 2.是否有支持任何形式的多线程的arraylist?可以使用向量代替数组。因为向量是线程安全的。请查看此项 你应该

我需要将arraylist写入文件。
它总是被填满,当它变得太大时,我需要开始写它

所以我想检查arraylist sise何时大于100,然后追加文件并写入当前行。
但问题是有时它在几分钟内没有被填充,我想将数据转储到一个文件中。
因此,我的第二个想法是让另一个线程每隔几秒钟检查一次是否有行,并将其转储到文件中。
但是,我需要管理线程之间的锁

我的问题是:
1.多线程设计正常吗?

2.是否有支持任何形式的多线程的arraylist?

可以使用向量代替数组。因为向量是线程安全的。

请查看此项

你应该使用

 List synchronizedList = Collections.synchronizedList(list);

您可以使用创建同步列表。

ArrayList不是线程安全的,但您可以使用集合获取线程安全的列表。synchronizedList()

而不是
ArrayList
我建议您使用的正确实现。如果您只是将数据附加到列表中,然后将其转储到文件中,从列表中删除保存的项目,那么队列是一个更好的选择


有些实现是线程安全的,甚至允许调用线程阻塞,直到队列中实际出现某个内容为止——这比使用轮询线程要好得多。看起来对您的案例非常有希望。

您需要使用创建线程安全列表。但是,您仍然需要同步操作,例如添加或删除列表中保存的对象,并同步这些对象的更新。

从您的问题中可以看出,您大部分时间都将执行写入操作,并且也将从单个线程执行写入操作&将间歇性地检查列表的大小。 另一方面,您不能使用普通的旧ArrayList

同步列表,然后使用锁访问列表,这看起来像是一种过激行为。 而是通过一个if检查来检查尺寸

如果您要在多个线程中访问列表,那么为了避免ConcurrentModificationException,请使用@Ludevik建议的方法


还有其他方法,但为了简单起见@Ludevik方法很合适。

简单的解决方案是使用
集合。synchronizedList(list)
Vector
。然而,有一个问题

按上述方式创建的同步列表/
Vector
iterator()
方法不同步。因此,如果使用迭代器显式地复制新元素,通过使用
for(type var:list){…}
或使用依赖于迭代器的复制构造函数,那么没有什么可以阻止线程尝试将新元素添加到列表中

这可能会导致并发修改异常。为了避免这个问题,您需要自己进行锁定



最好使用并发队列类,以便将内容写入文件的线程不需要迭代列表

Vector接近于deprecatedYes,但它仍然是线程安全的,使用的次数少于同步的集合,但它的使用方式仍然类似于HashTable。