将读取同步到java集合

jef*_*eff 8 java thread-safety

所以我想要一个存储一系列股票报价的arraylist.但我会跟踪每个的出价,要价和最后价格.

当然,任何时候,特定股票的买入价或最后价格都可能发生变化.

我有一个更新价格的线程和一个读取它们的线程.

我想确保在阅读时没有其他线程正在更新价格.所以我看了同步集合.但这似乎只是阻止阅读,而另一个线程正在添加或删除arraylist的条目.

所以现在我进入包装方法:

public class Qte_List {
private final ArrayList<Qte> the_list;

public void UpdateBid(String p_sym, double p_bid){
    synchronized (the_list){
        Qte q = Qte.FindBySym(the_list, p_sym);
        q.bid=p_bid;}
}

public double ReadBid(String p_sym){
    synchronized (the_list){
        Qte q = Qte.FindBySym(the_list, p_sym);
        return q.bid;}
}
Run Code Online (Sandbox Code Playgroud)

所以我想用这个来完成的只有一个线程可以做任何事情 - 一次读取或更新the_list的内容.我接近这个吗?

谢谢.

DJC*_*rth 1

据我了解,您正在使用地图来存储报价;报价数量永远不会改变,但可以读取或修改每个报价以反映当前价格。重要的是要知道锁定集合只能防止对映射中的 Quote 对象进行更改:它不会以任何方式限制对这些 Quotes 内容的修改。如果您想限制该访问,则必须对 Quote 对象提供锁定。

但是,查看您的代码,我不认为您存在严重的同步问题。如果您尝试在写入的同时进行读取,您将获得写入之前的价格或写入之后的价格。如果您不知道会发生写入,那对您来说并不重要。您可能需要在更高级别上锁定,以便

if (getBidPrice(mystock)<10.0) {
  sell(10000);
}
Run Code Online (Sandbox Code Playgroud)

作为原子操作发生,您最终不会以 5.0 而不是 10.0 的价格出售。

如果引号的数量确实没有改变,那么我建议只允许在 Qte_List 的构造函数中添加 Qte 对象。这将使锁定集合变得无关紧要。其技术术语是使 Qte_List不可变