防止对象的并发修改

时间:2014-05-16 21:17:08

标签: java multithreading apache-camel

我在Apache Camel中有2条路线,MultimapRoute(在程序开始时根据数据库查询的结果初始化Multimap对象)和UpdatingRoute(用于更新数据库的监听器,其中Multimap对象已更新)当数据库更新时)。我想确保首先运行MultimapRoute,并按顺序处理来自UpdatingRoute的所有更改。我还想确保解决所有并发问题。

这是MultimapRoute类:

public class MultimapRoute implements org.apache.camel.Processor {
    static Multimap<String, String> m = new ArrayListMultimap<String, String>();
    static ReentrantLock l = new ReentrantLock();

    public void process(Exchange exchange) throws Exception {
        try {
            l.lock();
            //Query the database and fill out the map initially
        } finally {
            if (l.isHeldByCurrentThread()) l.unlock();
        }
    }
}

这是UpdatingRoute类:

public class UpdatingRoute implements org.apache.camel.Processor {
    public void process(Exchange exchange) throws Exception {
        try {
            l.lock();
            //Update the database based on latest event
        } finally {
            if (MultimapRoute.l.isHeldByCurrentThread())
                MultimapRoute.l.unlock();
        }
    }
}

我不确定这种多线程方法的线程安全性或其他问题是什么,或者如何使程序成为线程安全的。但我被告知这不是处理这个特定应用程序的多线程的正确方法。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

首先,您需要以两种方式在两条路线之间进行沟通以实现此目的:

  

我想确保首先运行MultimapRoute,并按顺序处理来自UpdatingRoute的所有更改。

为此,我建议您使用基于Condition的{​​{1}}。

现在,问题的第二部分:

  

我不确定这种多线程方法的线程安全或其他问题是什么,或者如何使程序成为线程安全的。

首先,您需要清楚地了解您希望如何使其成为线程安全的。我猜 - 你想确保没有线程能够访问地图ReentrantLock,而某些线程成功启动m方法(我的意思是,获得锁定)。为此,请尝试更改您访问地图的方式。我的意思是,现在它没问题,但是在这两个类之外可以看到对地图的引用。以下是我的建议,实施了两个想法:

process()
相关问题