get和set方法的同步

时间:2015-08-26 12:08:58

标签: java multithreading thread-safety

我是Java线程中的新手,我需要你的帮助。

public enum IndicatorTimestamp {
    instance;
    private JSONObject indicatorTmsUTC;

    public void setIndicatorTimestamps(JSONObject indicatorTmsUTC) {
        this.indicatorTmsUTC = indicatorTmsUTC;
    }

    public String getUtcTmsForTag(String tag) {
        try {
            if (indicatorTmsUTC != null) {
                return indicatorTmsUTC.getString(tag);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}

我需要锁定indicatorTmsUTC个对象。如果我为这两种方法添加了synchronized字,那没关系。 public synchronized void setIndicatorTimestampspublic synchronized String getUtcTmsForTag。 还是有其他解决方案?

5 个答案:

答案 0 :(得分:0)

您可以在属性上使用synchronized来锁定它。 如果你想要更好的调整锁定,如读写锁定,我建议你看看java concurrent API

它提供了完全替换粗同步关键字的工具。

答案 1 :(得分:0)

你可以:

  • 在getter和setter上同时使用synchronized
  • 在getter和setter中同时使用Lock
  • 使用ReadWriteLock,使用getter中的read Lock和setter中的write Lock

第三种解决方案的优点是您可以同时读取同时的线程。

答案 2 :(得分:0)

你可以做这样的事

public void setIndicatorTimestamps(JSONObject indicatorTmsUTC) {
   synchronized(indicatorTmsUTC) {
         this.indicatorTmsUTC = indicatorTmsUTC;     
   }
}

答案 3 :(得分:0)

你的方法还不错。由于没有任何共享变量,因此不存在任何死锁情况。无论如何,拥有同步块而不是同步方法会更好。

// Create the Andersen family document.
Family AndersenFamily = new Family
{
    Id = "AndersenFamily",
    LastName = "Andersen",
    Parents =  new Parent[] {
        new Parent { FirstName = "Thomas" },
        new Parent { FirstName = "Mary Kay"}
    },
    IsRegistered = true
};

await client.CreateDocumentAsync(documentCollection.DocumentsLink, AndersenFamily);

答案 4 :(得分:0)

我认为你会遇到JSONObject的可变性问题。虽然添加建议的同步会使enum线程安全,但JSONObject本身也不能说明。

我建议的做法是创建一个不可变类来封装要转换为JSON的数据,并将该类作为实例变量放在enum而不是JSONObject中。然后在getUtcTmsForTag方法中执行JSON序列化。