Gson örneğini model çekirdeğinde statik bir alan olarak kullanmak yeniden kullanılabilir mi (yeniden kullanım)?


138

İşte benim uyguladığım model:

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

Her LoginSession örneği için yeni Gson örneği oluşturmanın yararsız olduğunu düşündüm.

Ama endişelendiğim konu iplik güvenliği sorunları. Yaklaşık 1000+ örnek / sn oluşturulur.

Gson örneğini statik alan olarak kullanmak uygun mudur?

Tavsiyeler / düzeltmeler için teşekkürler.

Yanıtlar:


133

Bana iyi geliyor. GSON örneğinde, onu belirli bir örneğiyle ilişkilendiren hiçbir şey yoktur LoginSession, bu nedenle statik olmalıdır.

GSON bulut sunucuları iş parçacığı açısından güvenli olmalıdır ve düzeltilenle ilgili bir hata oluştu.


@slott, Gson örneklerini nasıl havuzlar / yeniden kullanırsınız? Her serileştirmeniz gerektiğinde bir tane mi somutlaştırıyorsunuz? Veya bir iş parçacığı havuzu kullanın?
Dilum Ranatunga

GSON'u Google Volley ile birlikte kullanıyoruz ve JSON verilerini aynı anda ayrıştırdığımızda bu sorunu görüyoruz. Gördüğüm kadarıyla, datetime değerlerini ayrıştırmak için bir zaman damgası tanımladığımızla ilgilidir.
slott

1
Tarih saat iş parçacığı için güvenli değildir, bunun nedeni olabilir, GSON iş parçacığı için güvenli değildir.
Andreas Mattisson

20

Çekirdek Gsonsınıf iş parçacığı için güvenlidir. GSON ile ilgili olduğu söylenen bir iş parçacığı güvenliği sorunuyla yeni karşılaştım. Özel bir kullanırken sorun oldu JsonDeserializerve JsonSerializeriçin Dateayrıştırma ve biçimlendirme. Anlaşıldığı üzere, iş parçacığı güvenliği sorunu, yöntemimin SimpleDateFormatiş parçacığı için güvenli olmayan statik bir örneği kullanmasıyla ilgiliydi. Statiki SimpleDateFormatbir ThreadLocalörnekte sardığımda her şey yolunda gitti.


4
Daha iyi bir seçenek, açıkça threadsafe olan Apache commons FastDateFormat'ı (commons-lang'ın bir parçası) kullanmak olabilir. commons.apache.org/proper/commons-lang/apidocs/org/apache/…
Marceau

Teşekkürler @Zaan. Harika bir ipucu!
entpnerd

8

Yorumlara göre, mevcut birim testi çok fazla test yapmıyor, iplik güvenliği ile ilgili her şeye dikkat edin ...

İplik güvenliği için bir birim test kontrolü vardır:

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

Bu birim testinin olası her makine yapılandırmasında olası her sorunu bulmak için yeterli olup olmadığını merak edebilirsiniz. Bu konuda herhangi bir yorumunuz var mı?

Dokümanlarda şu cümle de var :

Gson örneği, Json işlemlerini çağırırken herhangi bir durumu korumaz. Böylece, aynı nesneyi çoklu Json serileştirme ve serileştirme işlemleri için tekrar kullanabilirsiniz.


3
Bu birim testin eşzamanlılık sorunlarını tespit etmek için yetersiz olduğunu söyleyebilirim. İlk olarak, MyObject, karmaşık koleksiyonlar içermeyen önemsiz bir sınıftır, bu nedenle listelerin ve haritaların ve diğer karmaşık nesnelerin eşzamanlı olarak de / serileştirilmesi test edilmez. İkincisi, serileştirme, 10 ipliğin her biri için sadece 10 kez yinelenir, bu da yetersizdir. Üçüncüsü, farklı donanım yapılandırmaları farklı çalışma zamanı özelliklerine sahip olduğu için eşzamanlılık hatalarının zaten test edilmesi zordur, bu nedenle herhangi bir test yalnızca tüm yapılandırmalarda çalıştırılacağı garanti edilirse geçerli olacaktır.
Lawrence Dol

1
Örneğin, bu test muhtemelen tek bir çekirdek makinede eşzamanlılık hatası bulamayacaktır, çünkü her bir iş parçacığı muhtemelen tek bir zaman diliminde tamamlanacaktır ve bu nedenle iş parçacıkları aynı anda değil ardışık olarak çalışacaktır.
Lawrence Dol

3
Hayır, güvenli değil demek, sadece bu testin uzaktan olduğunu bile garanti etmiyor.
Lawrence Dol

1

Bir süre önce iplik güvenliği ile ilgili sorunlar yaşadık ve apache ortaklarında FastDateFormat kullanarak çözdük.

Gson örneklerinin yeniden kullanıp kullanamayacağını merak eden insanlara yardımcı olmak için bu konuda Gist için bir bağlantı oluşturdum . Ayarlayıcıları yoktur ve her çeşit özeldir.

Yani SimpleDateFormat sorunu dışında başka hiçbir yerde durumu koruduğunu görmüyorum.

Kontrol ediyor musunuz bunu dışarı. Bunlardan birine ilk kez cevap veriyorum. Bir kez geri verdiğim için mutluyum. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.