2012-04-30 25 views
103

這裏我實現了模型:可以將Gson實例用作模型bean中的靜態字段(重用)嗎?

public class LoginSession { 
    private static final Gson gson = new Gson(); 

    private String id; 
    private String name; 
    private long timestamp; 

    public LoginSession(String id, String name) { 
     this.id = id; 
     this.name = name; 
     this.timestamp = System.currentTimeMillis(); 
    } 

    public String toJson() { 
     return gson.toJson(this); 
    } 

    public static LoginSession fromJson(String json) { 
     checkArgument(!isNullOrEmpty(json)); 
     return gson.fromJson(json, LoginSession.class); 
    } 
} 

我想了也沒用,每LoginSession實例創建新GSON實例。

但我擔心的是線程安全問題。將創建約1000+個實例/秒。

將Gson實例用作靜態字段可以嗎?

感謝您的任何建議/更正。

回答

90

對我來說這似乎很好。 GSON實例中沒有任何內容使其與LoginSession的特定實例相關,因此它應該是靜態的。

GSON實例should be thread-safe,並且有一個固定的bug regarding

+7

由於GSON的併發問題,我們剛剛發生了崩潰。所以我不認爲它是100%線程安全的 - 至少不會打電話給Json。 – slott

+0

@slott,你們如何彙集/重用Gson實例?你是否每次需要序列化時都要實例化一個?或者使用threadlocal池? –

+0

我們將GSON與Google Volley一起使用,當我們解析JSON數據併發時,我們看到了這個問題。從我可以看到這與我們爲解析日期時間值定義時間戳的事實有關。 – slott

8

根據現有的單元測試並沒有真正考驗很多,要小心線程安全相關的任何評論...

有一個unit test檢查線程安全:

/** 
* Tests for ensuring Gson thread-safety. 
* 
* @author Inderjeet Singh 
* @author Joel Leitch 
*/ 
public class ConcurrencyTest extends TestCase { 
    private Gson gson; 
    ... 

你可能想知道這種單元測試是否足以在每種可能的機器配置上找到每個可能的問題?對此有何評論?

也有這句話在docs

在調用的Json 操作的GSON實例不保持任何狀態。因此,您可以自由地將相同的對象用於多個JSON序列化和反序列化操作。

+2

我會說這個單元測試可悲地不足以檢測併發問題。首先,MyObject是一個平凡的類,沒有涉及複雜的集合,因此不會對列表和地圖以及其他複雜對象的並行de/serialization進行測試。其次,序列化僅對10個線程中的每一個迭代10次,這是不夠的。第三,併發性故障無論如何都難以測試,因爲不同的硬件配置具有不同的運行時特性,所以任何測試只有在保證在所有配置上運行的情況下才有效。 –

+0

例如,此測試很可能在單核機器上找不到任何併發故障,因爲每個線程可能會在單個時間片內完成,因此線程將連續運行,而不是同時運行。 –

+1

不用說它不是線程安全的,只是這個測試甚至不能遠程保證它。 –

10

核心Gson類是線程安全的。我剛剛遇到了與GSON有關的線程安全問題。當使用自定義JsonDeserializerJsonSerializer來解析和格式化Date時,會發生此問題。事實證明,線程安全問題是由於我的方法使用了非線程安全的靜態SimpleDateFormat實例。一旦我將靜態SimpleDateFormat包裝在ThreadLocal實例中,一切都很順利。

+2

更好的選擇可能是使用Apache commons FastDateFormat(commons-lang的一部分),它明確是線程安全的。 https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html – Zaan

+0

謝謝@Zaan。偉大的提示! – entpnerd

相關問題