我有一个必须使用的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链表执行此操作。也许我可以保留一个锁数组并为每个列表锁定相应的锁?有点卡住了怎么做
答案 0 :(得分:0)
这个问题的答案与... [插入自己选择的适当类比]
既有读写功能吗?这些相对的频率?
甚至有问题吗?测过?期望?有什么瓶颈? 一个有趣的思想实验?
一些选项:
使用并发无锁集合。参见java.util.concurrent。
很少写,经常读吗?也许使用CopyOnWriteArrayList
,或者也许使用ConcurrentLinkedDeque
。看看java.util.concurrent package的文档。
只需一个大的同步/锁定并开心。
根据您的建议,每个列表一个锁/同步。就像在您的代码示例中一样使用syncize。如果您愿意,也可以使用一个单独的对象或Lock
对象进行同步。
在创建它们时可能仅使用Collections.synchronizedList(...)
就足够了(例如,无需遍历)。
为2,但使用写和读锁定(允许多个并发读取器,但仅允许一个写入器)。参见ReadWriteLock
。尽管要小心,但除了学习之外,并发地“做自己的事”几乎不值得。
与3相同,但使用4中的读写锁,但按列表使用。
我肯定会自己选择1的变体,而不会知道更多,甚至可能不知道。也许2或3。我已经完成5和6,但很少值得,只是为了娱乐!
注意: LinkedList
在实践中很少有用,实现的作者嗨,自称自己从未使用过它们。只需使用ArrayList
。更快,更少的内存等。除非在结束时进行了很多删除操作。