2010-10-19 14 views
5

Çok iş parçacıklı bir ortamda, bir iş parçacığı 'kısmen oluşturulmuş bir nesneyi' nasıl görebilir? Birden çok iş parçacığı birden çok örnek oluşturabildiğinden, iş parçacığının güvenli olmadığını anladım.Kısmen dişli olmayan tek parçalı nesnelerde kısmen oluşturulmuş nesneler Singleton

class LazyInit 
{ private static Resource resource = null; 

    public static getInstance() 
    { if (resource == null) { resource = new Resource(); } 
     return instance; 
    } 
} 
+1

https://secure.wikimedia.org/wikipedia/en/wiki/Double-checked_locking konusuna bakın. – Bozho

cevap

7

Sipariş dışı yazım nedeniyle.

Yapıcınız nihai olmayan üyelere yazıyorsa, belleğe hemen bağlı kalmaları gerekmez ve aslında bunlar singleton değişkeninden sonra bile işlenebilir. Java, onu etkileyen ipucunu emirleri sırayla görmeyi garanti eder, ancak bir bellek bariyeri koymadıkça başka ipler de olmaz.
Daha fazla bilgi için Java belirtiminin this question ve this page numaralarına bakın.

Bu noktanın yanında olabilir, ancak örneğinizde, iki parçacığın farklı singletonlar görmesi tamamen mümkündür. Bir iş parçacığının değişkenin hükümsüzlüğünü test ettiğini, if'a girip nesnenin oluşturulma şansı olmadan önce önlenmesini sağladığını varsayalım. Şimdi CPU'yu alan yeni iş parçacığı henüz null nesnesini test eder, singleton'u oluşturur. Eski iş parçacığı yeniden çalışmaya başladığında, nesneyi oluşturmayı ve tekil değişkeninin üzerine yazmayı mutlu edecektir.
Başka bir, daha da korkutucu bir sorun, Resource kurucusu, sonuçta bu getInstance'a başka bir çağrıyla sonuçlanacak bir yöntem çağırırsa ortaya çıkar. Programın durumu sonsuz bir döngüye neden olmasa bile, birkaç tekil örneği oluşturacaksınız.

İlgili konular