我是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 setIndicatorTimestamps
和
public synchronized String getUtcTmsForTag
。
还是有其他解决方案?
答案 0 :(得分:0)
您可以在属性上使用synchronized来锁定它。 如果你想要更好的调整锁定,如读写锁定,我建议你看看java concurrent API
它提供了完全替换粗同步关键字的工具。
答案 1 :(得分:0)
你可以:
第三种解决方案的优点是您可以同时读取同时的线程。
答案 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序列化。