同步数组列表中的竞争条件
Race condition in synchronized arraylist
我将对象列表的处理包含在一个同步块中,但最终处于竞争状态。我是不是错误地使用了 synchronized 块,还是我的代码有其他问题?该列表实际上是用 mapdb 实例化的。
private static List<MessageHolder> msgHolders;
//messageSequenceDB instantiation
msgHolders = (List<MessageHolder>) messageSequenceDB.indexTreeList("tempStorage", Serializer.JAVA).createOrOpen();
synchronized (msgHolders) {
System.out.println(Thread.currentThread().getName() +"->"+msgHolders.toString());
for (MessageHolder holder : msgHolders) {
if(holder.getStatus().equalsIgnoreCase(STATUS_INITIAL) {
holder.setStatus(STATUS_DISPATCHED);
LOGGER.info("MESSAGE SEQUENCER: Message {} dispatched", holder);
//Remaining code
}}}
我希望一个对象仅由一个线程处理。如果第二个线程尝试分派它,状态条件应该失败。但是我得到的输出是,所有线程都处理了很少的消息。
在此处提供示例输出。
pool-12-thread-1->[MessageHolder [key=TradeId.1, message=1, status=Initial], MessageHolder [key=TradeId.2, message=222, status=Initial]]
pool-12-thread-2->[MessageHolder [key=TradeId.2, message=222, status=Initial], MessageHolder [key=TradeId.1, message=1111, status=Initial]]
pool-12-thread-3->[MessageHolder [key=TradeId.2, message=222, status=Initial]]
pool-12-thread-1->[MessageHolder [key=TradeId.1, message=11, status=Initial]]
ID 为 222 的消息被所有 3 个线程处理。我应该怎么做才能确保同步?
我已经通过将字段状态设置为易失性来解决这个问题。
我将对象列表的处理包含在一个同步块中,但最终处于竞争状态。我是不是错误地使用了 synchronized 块,还是我的代码有其他问题?该列表实际上是用 mapdb 实例化的。
private static List<MessageHolder> msgHolders;
//messageSequenceDB instantiation
msgHolders = (List<MessageHolder>) messageSequenceDB.indexTreeList("tempStorage", Serializer.JAVA).createOrOpen();
synchronized (msgHolders) {
System.out.println(Thread.currentThread().getName() +"->"+msgHolders.toString());
for (MessageHolder holder : msgHolders) {
if(holder.getStatus().equalsIgnoreCase(STATUS_INITIAL) {
holder.setStatus(STATUS_DISPATCHED);
LOGGER.info("MESSAGE SEQUENCER: Message {} dispatched", holder);
//Remaining code
}}}
我希望一个对象仅由一个线程处理。如果第二个线程尝试分派它,状态条件应该失败。但是我得到的输出是,所有线程都处理了很少的消息。
在此处提供示例输出。
pool-12-thread-1->[MessageHolder [key=TradeId.1, message=1, status=Initial], MessageHolder [key=TradeId.2, message=222, status=Initial]]
pool-12-thread-2->[MessageHolder [key=TradeId.2, message=222, status=Initial], MessageHolder [key=TradeId.1, message=1111, status=Initial]]
pool-12-thread-3->[MessageHolder [key=TradeId.2, message=222, status=Initial]]
pool-12-thread-1->[MessageHolder [key=TradeId.1, message=11, status=Initial]]
ID 为 222 的消息被所有 3 个线程处理。我应该怎么做才能确保同步?
我已经通过将字段状态设置为易失性来解决这个问题。