2012-04-30 26 views
103

Dưới đây là mô hình tôi thực hiện:Có thể sử dụng trường hợp Gson như một trường tĩnh trong bean mẫu (tái sử dụng) không?

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); 
    } 
} 

tôi nghĩ nó vô dụng để tạo ra dụ Gson mới cho mỗi trường hợp LoginSession.

Nhưng điều tôi lo lắng là các vấn đề về an toàn luồng. Khoảng 1000 trường hợp/giây sẽ được tạo.

Bạn có thể sử dụng trường hợp Gson làm trường tĩnh không?

Cảm ơn mọi lời khuyên/chỉnh sửa.

Trả lời

90

Có vẻ như tốt với tôi. Không có gì trong trường hợp GSON làm cho nó liên quan đến một cá thể cụ thể của LoginSession, vì vậy nó phải là tĩnh.

Trường hợp GSON should be thread-safe và có bug regarding đã được sửa.

+7

Chúng tôi vừa gặp sự cố do các sự cố đồng thời với GSON. Vì vậy, tôi không nghĩ rằng nó là 100% thread an toàn - ít nhất là không sau đó gọi toJson. – slott

+0

@slott, làm thế nào để các bạn bơi/tái sử dụng các trường hợp Gson? Bạn có khởi tạo mỗi lần bạn cần serialize không? Hoặc sử dụng một hồ bơi threadlocal? –

+0

Chúng tôi sử dụng GSON cùng với Google Volley và khi chúng tôi phân tích cú pháp dữ liệu JSON đồng thời, chúng tôi thấy vấn đề này. Từ những gì tôi có thể thấy điều này có liên quan đến thực tế là chúng tôi xác định một dấu thời gian để phân tích giá trị datetime. – slott

8

Theo ý kiến ​​các đơn vị kiểm tra hiện không thực sự kiểm tra nhiều, hãy cẩn thận với bất cứ điều gì liên quan đến sợi an toàn ...

Có một unit test kiểm tra an toàn thread:

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

Bạn có thể tự hỏi nếu thử nghiệm đơn vị này là đủ để tìm mọi vấn đề có thể trên mỗi cấu hình máy có thể? Bất kỳ ý kiến ​​về điều này?

Ngoài ra còn có câu này trong docs:

Các dụ Gson không duy trì bất cứ tiểu bang trong khi gọi Json hoạt động. Vì vậy, bạn được tự do tái sử dụng cùng một đối tượng cho nhiều hoạt động serialization và deserialization Json.

+2

Tôi đã có thể nói thử nghiệm đơn vị này là không đủ để phát hiện các vấn đề tương tranh. Đầu tiên, MyObject là một lớp tầm thường không có các bộ sưu tập phức tạp liên quan đến việc de/serialization đồng thời các danh sách và bản đồ và các đối tượng phức tạp khác không được kiểm tra. Thứ hai, việc tuần tự hóa chỉ được lặp lại 10 lần cho mỗi một trong 10 chủ đề, điều này là không đủ.Thứ ba, lỗi đồng thời nổi tiếng là khó kiểm tra vì các cấu hình phần cứng khác nhau có các đặc tính thời gian chạy khác nhau, vì vậy mọi kiểm tra sẽ chỉ hợp lệ nếu được bảo đảm chạy trên tất cả các cấu hình. –

+0

Ví dụ, thử nghiệm này có thể sẽ không tìm thấy bất kỳ lỗi đồng thời nào trên một máy lõi đơn, vì mỗi luồng có thể sẽ hoàn thành trong một lần duy nhất và các chuỗi sẽ chạy liên tục, không đồng thời. –

+1

Không thể nói rằng nó không phải là chủ đề an toàn, chỉ rằng bài kiểm tra này thậm chí không bảo đảm từ xa. –

10

Lớp lõi Gson là an toàn chỉ. Tôi vừa gặp phải một vấn đề an toàn thread được cho là với GSON. Sự cố đã xảy ra khi sử dụng tùy chỉnh phân tích và định dạng JsonDeserializerJsonSerializer cho Date phân tích cú pháp và định dạng. Khi nó bật ra, vấn đề an toàn thread là với phương pháp của tôi sử dụng một trường hợp tĩnh SimpleDateFormat mà không phải là thread-safe. Một khi tôi bọc SimpleDateFormat tĩnh trong một ví dụ ThreadLocal, mọi thứ đều hoạt động tốt.

+2

Một lựa chọn tốt hơn có thể là sử dụng Apache commons FastDateFormat (một phần của commons-lang), vốn rõ ràng là an toàn. https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html – Zaan

+0

Cảm ơn @Zaan. Mẹo tuyệt vời! – entpnerd

Các vấn đề liên quan