同时访问链表的组

时间:2019-02-05 19:37:52

标签: java concurrency

我有一个必须使用的LinkedLists(java.util.LinkedList)数组。我的目标是能够最大程度地提高速度,从而在使用时锁定对每个链表的访问,但允许继续使用并且不锁定整个程序

我知道使用Java的同步链接列表,我可以执行以下操作:

Queue[] linkedlistArray = new LinkedList[5]; //array of Linked Lists

//say I want to edit linklist 2, but want to allow other threads to access 
 the other linked lists 

int i = 2;
synchronized(linkedlistArray[i]){
   //edit this lift safetly
}

是否有解决方案,如何使用普通的Java链表执行此操作。也许我可以保留一个锁数组并为每个列表锁定相应的锁?有点卡住了怎么做

1 个答案:

答案 0 :(得分:0)

这个问题的答案与... [插入自己选择的适当类比]

既有读写功能吗?这些相对的频率?

甚至有问题吗?测过?期望?有什么瓶颈? 一个有趣的思想实验?

一些选项:

  1. 使用并发无锁集合。参见java.util.concurrent。 很少写,经常读吗?也许使用CopyOnWriteArrayList,或者也许使用ConcurrentLinkedDeque。看看java.util.concurrent package的文档。

  2. 只需一个大的同步/锁定并开心。

  3. 根据您的建议,每个列表一个锁/同步。就像在您的代码示例中一样使用syncize。如果您愿意,也可以使用一个单独的对象或Lock对象进行同步。

  4. 在创建它们时可能仅使用Collections.synchronizedList(...)就足够了(例如,无需遍历)。

  5. 为2,但使用写和读锁定(允许多个并发读取器,但仅允许一个写入器)。参见ReadWriteLock。尽管要小心,但除了学习之外,并发地“做自己的事”几乎不值得。

  6. 与3相同,但使用4中的读写锁,但按列表使用。

我肯定会自己选择1的变体,而不会知道更多,甚至可能不知道。也许2或3。我已经完成5和6,但很少值得,只是为了娱乐!

注意: LinkedList在实践中很少有用,实现的作者嗨,自称自己从未使用过它们。只需使用ArrayList。更快,更少的内存等。除非在结束时进行了很多删除操作。