2010-07-15 23 views
7

SimpleDateFormat ve NumberFormat öğelerinin iş parçacığı DEĞİLDİR.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500Java MessageFormat Sınıfı iş parçacığı güvenli mi? (SimpleDateFormat'ın aksine)

Ancak MessageFormat gibi diğer Format sınıflarına ne dersiniz?

Fortify 360, "Race Condition - Format Flaw" sorunu olarak "MessageFormat.format (String, Object ...)" statik yönteminin işaretini işaretliyor, ancak MessageFormat'ın kaynak kodunu analiz ettiğimde Bu yöntemde, MessageFormat'ın yeni bir yerel örneğini oluşturur.

Java MessageFormat Sınıfı iş parçacığı güvenli mi? MessageFormat için

cevap

9

javadoc diyor ki:

İleti biçimleri senkronize edilmez. Her iş parçacığı için ayrı biçim örneklerinin oluşturulması önerilir. Birden çok iş parçacığı eşzamanlı olarak bir biçimine erişirse, harici olarak eşitlenmelidir.

Resmi olarak, hayır - iş parçacığı güvenli değil.

SimpleDateFormat için dokümanlar aynı şeyi söyler.

Artık dokümanlar sadece muhafazakâr davranıyor olabilir ve pratikte çok sayıda iş parçacığında gayet iyi çalışır, ancak bu riske değmez.

+0

JavaDoc'u gösterdiğiniz için teşekkürler, bu benim için yeterli olur. MessageFormat'ın kaynak kodunu görüntülediğimde, iş parçacığının neden güvenli olmadığını anlamak bile bana göre daha net. Bu sınıf, NumberFormat ve DateFormat öğelerini kullanır, iki iş parçacığı güvenli değil. – thenonhacker

6

Eğer yöntemle

public static String format(String pattern, Object... arguments) 

bu iş parçacığı güvenli olarak javadoc açıklanan beri olduğu bu biçimlendirme yapmak için yeni bir MessageFormat oluşturur değinilirse varsa.

BTW, MessageFormat nesneler evreli çünkü, başlık 'SimpleThreadFormat' :) javadoc Başına

0

komik yazım hatası bu. İhtiyacı olan her iş parçacığı için ayrı bir nesne oluşturmak için ThreadLocal kullanabilirsiniz.

ThreadLocal<MessageFormat> threadLocalMessageFormat = 
    new ThreadLocal<MessageFormat>() { 
     @Override 
     protected MessageFormat initialValue() { 
      return new MessageFormat(pattern); 
     } 
    }; 

Ardından Geçerli evre için MessageFormat elde etmek threadLocalMessageFormat.get() kullanabilirsiniz.

İlgili konular