2011-11-01 12 views
44

I WeakReference, _components bir Collections.synchronizedList sahiptir; , senkronize blok içerisindeki dönüş değeri kötü tarzı gibi görünüyor. Gerçekten önemli mi?

Ben derleyici şikayet bekliyor, aşağıdaki gibi bir şeyler yazdı:

public boolean addComponent2(Component e) { 
    synchronized (_components) { 
     return _components.add(new WeakReference<Component>(e)); 
    }   
} 

Ama derleyici mükemmel memnun olduğunu. List.add() öğesinin TRUE değerini döndürdüğünü unutmayın. Tamam, senkronize edilmiş bir bloktan herhangi bir çıkış, kilidi serbest bırakır, ancak bu LOOK garip değil mi? Bu, bir döngüde geri dönüşün kullanılmasına benzeyen, blokta bir "delik" gibi bir şey.

Böyle kodu muhafaza mutlu olabilir mi? Bir synchronized bloğun içine dönen yanlış bir şey yoktur

cevap

52

Bir döngüden döndüğünden veya uygun bir finally bloğuna sahip bir try satırından kesinlikle iyi. Sadece anlambilimden haberdar olmanız gerekir, bu noktada tam anlamıyla mantıklıdır.

Kesinlikle onun uğruna bir yerel değişken tanıtan daha basit kod: çok zaten artık ben genellikle çok bloğun içine dönmek iken

// Ick - method body is now more complicated, with no benefit 
public boolean addComponent2(Component e) { 
    boolean ret; 
    synchronized (_components) { 
     ret = _components.add(new WeakReference<Component>(e)); 
    } 
    return ret; 
} 
+1

(aslında, ilkel senkronizasyon bloklarını kullanarak kendimi bulmuyorum ama yine de) bunu baştan yapmanın bazı yararları olabilir. Yalnızca senkronizasyon bloğuna sahipseniz ve daha sonra bazı ekstra kodların eklenmesi gerekiyor ancak bu kod senkronizasyon gerektirmiyorsa, siz bunu zaten kırmışsınız demektir. Kırılmazsa, gelecekteki devirler, daha kolay olduğundan monitörü gereksiz yere bağlayabileceğinden, senkronizasyon bloğunun içindeki ekstra kodu ekleyebilir. Bu yüzden hala formun içinde geri dönüyorum, ama gelecek için bazı küçük faydalar var. – corsiKa

+3

@corsiKa: * bu değişiklik gerekiyorsa sadece parası gelecek * için var. bu zorunlu değildir, o zaman IMO * okuma * kod biraz daha zor bütün zaman yapar. –

38

. Kilit doğru şekilde bırakılacaktır.

İlgili konular