我面临这个问题: 我有很多线程(1024)谁访问一个大集合 - 矢量。 问题: 是否可以做一些有关它的事情,使我可以对其执行并发操作而无需同步所有内容(因为这需要时间)?我的意思是,像Mysql数据库的作品,你不必担心同步和线程安全问题。在Java中有一些集合吗?谢谢Java:大集合和并发线程
回答
Vector是一个非常古老的Java类 - 早于Collections API。它在每个操作上都同步,所以你不会试图加速它。 您应该考虑重新编写代码以使用ConcurrentHashMap或LinkedBlockingQueue等高度优化的并发访问。
如果失败了,你提到你希望性能和访问语义类似于数据库 - 为什么不使用专用数据库或消息队列?他们可能会比以往任何时候都更好地实现它,并且它更少编写代码!
[编辑]鉴于您的评论:
all what thread does is adding elements to vector
(only if num of elements in vector = 0) &
removing elements from vector. (if vector size > 0)
这听起来很像你应该使用的东西更像是一个比队列列表!一个大小为1的有界队列会给你这些语义 - 尽管我会问,为什么你不能添加元素,如果已经有东西。当你有成千上万的线程时,这似乎是一个非常低效的设计。
首先,这种设计听起来不太对。这听起来像需要考虑使用适当的数据库而不是简单的数据结构,即使这意味着只需使用内存中的实例HypersonicDB即可。
但是,如果你坚持这样做,那么java.util.concurrent包有很多高度并发的非锁定数据结构。他们中的一个可能适合你的目的(如ConcurrentHashMap,如果你可以使用一个Map
而不是List
)
-1:考虑到他对Vector的使用的评论,我认为Steven Schlansker关于考虑队列的答案更合适。 –
如果你认为这是一个糟糕的问题,你会低估一个答案,而不是因为你认为另一个答案更好。 – skaffman
看起来要实现生产者消费者模式,你应该谷歌“制作人消费的Java”或看看the BlockingQueue interface
我同意skaffman关于查看java.util.concurrent。
ConcurrentHashMap具有很高的可扩展性。但是,它的size()调用只返回一个近似值。所以例如即使!(vector中的元素数量= 0),您的应用程序偶尔也会添加元素。
如果你想严格执行你给出的条件,除了同步外没有别的办法。
而不是有大量的上下文切换,我想你可以让你的用户线程发布一个可调用的队列,并且只有一个线程处理突变。这将消除对集合进行同步的需要。用户线程可以在Future.get()上等待。
只是一个想法。
如果您不想更改数据结构并且只有很少的写入操作,那么也可以使用一个或多个ReentrantReadWriteLock来同步访问。然后许多线程可以同时读取,但是当线程想要写入时,所有读取都会被阻塞,直到写入完成。
但是您应该检查使用的数据结构是否适合该任务,或者多个java.util或java.util.concurrent类中的另一个是否更合适。顺便说一句,java.util.Vector 是同步。
- 1. Java并发和多线程
- 2. Java并发集合搜索
- 3. 的Java:并发集合
- 4. JAVA线程并发
- 5. Java线程并发读取和写入
- 6. Java监视器和线程并发性
- 7. 收集合同和线程
- 8. Java线程并发性
- 9. Java并发唤醒线程
- 10. Java线程的并发性
- 11. 并行线程和并发
- 12. 最大并发线程数小于最大线程池大小
- 13. 线程处理C#中的大集合
- 14. WPF UI线程阻塞与大集合
- 15. 线程安全的找到并集合
- 16. Java在并发中集合/获取集合
- 17. 并发读取和写入Java集合以外的最快速集合
- 18. 获取大小和删除元素模式的Java线程安全集合
- 19. 迭代并发集合时的线程安全
- 20. 同时处理N个并发线程的对象集合
- 21. 使用并发词典 - 线程安全集合修改
- 22. 并发集合上通用参数的线程安全问题
- 23. Python - BaseHTTPServer.HTTPServer并发和线程
- 24. 线程和并发hickup
- 25. Docker组合和并发集成测试
- 26. 的MongoDB +常模并发和集合
- 27. .net最大并发计时器线程
- 28. Scala并行集合:如何知道和配置线程数
- 29. TSQL大数据集合并
- 30. 合并程序集
为什么你有1024线程?太疯狂了。 –
我有8个核心CPU和8GB内存,有3000个用户访问我的应用程序,所以我认为没关系,不是吗? – Andrey
@Mark:不一定,它只是一个非常高度的并发性。但是,8个内核上的1024个线程可能过多。 – skaffman