1

目前我正在使用LinkedList添加所有Command信息。如何使以下List<Command>线程安全?我应该在这里使用其他选项LinkedList吗?

private static List<Command> commands;

Command command = new Command();
command.setName(commandName);
command.setExecutionPercentage(Double.parseDouble(percentage));
command.setAttributeIDGet(attributeIDGet);
command.setAttributeIDSet(attributeIDSet);
command.setDataUsageCriteria(dataCriteria);
command.setUserLoggingCriteria(userLoggingCriteria);
command.setSleepTime(sleepTimeOfCommand);

我正在添加command通过从文本文件中读取并将其放入LinkedList of command如下所示的所有内容。所以假设如果我有,three command那么我需要将所有这些添加three commandLinkedList我正在做的事情中。

commands.add(command);

如果我做下面的事情怎么办? -

Collections.synchronizedList(commands.add(command));

或者我需要做这样的事情-

commands = Collections.synchronizedList(new LinkedList<Command>());

更新:-

根据您的建议,如果我使用 -

private static Queue<Command> commands;


commands = new ConcurrentLinkedQueue<Command>(); // Using linked list to ensure iteration order



Command command = new Command();
command.setName(commandName);
command.setExecutionPercentage(Double.parseDouble(percentage));
command.setAttributeIDGet(attributeIDGet);
command.setAttributeIDSet(attributeIDSet);
command.setDataUsageCriteria(dataCriteria);
command.setUserLoggingCriteria(userLoggingCriteria);
command.setSleepTime(sleepTimeOfCommand);


commands.add(command);

在基本上完成所有初始化之后,我需要command information从队列中获取 ,所以我以前使用LinkedList. 但是在更改为之后ConcurrentLinkedQueue,这get call is giving me an error就像有一个error line on get call

commands.get(commandWithMaxNegativeOffset);

我得到的错误 -

 The method get(int) is undefined for the type Queue<Command>
4

1 回答 1

10

如何使以下 List 线程安全?我应该在这里使用其他选项而不是 LinkedList 吗?

ConcurrentLinkedQueue是一个并发链接队列。引用 javadocs:

基于链接节点的无界线程安全队列。此队列对元素进行 FIFO(先进先出)排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。当许多线程将共享对公共集合的访问时,ConcurrentLinkedQueue 是一个合适的选择。此队列不允许空元素。

所以你会做这样的事情:

 Queue<Command> concurrentQueue = new ConcurrentLinkedQueue<Command>();
 Command command = new Command();
 ...
 concurrentQueue.add(command);

您还可以List使用Collections.synchronizedList(...). 是否执行此操作或使用ConcurrentLinkedQueue取决于您需要该集合的高性能。

// turn the commands list into a synchronized list by wrapping it
commands = Collections.synchronizedList(commands);

如果您提供有关如何使用此队列的更多信息,我们可以在正确的 JDK 并发集合方面提供更多替代方案。

Collections.synchronizedList(commands.add(command));

您编辑了您的问题并询问了上述代码。它不会编译,因为List.add(...)返回一个布尔值。

于 2012-08-20T19:36:46.543 回答