2011-08-04 15 views
7

Bu, erken bir optimizasyon veya erken aşırı uyarıcı olabilir, ancak birkaç sınıfta singleton kullanmaktan kaçınıyorum çünkü bu yüzden, uygulamayı çok iş parçacıklı olarak çalıştırmam gerektiğinden endişeleniyorum. singletons çatışmalar ve dağınıklık yaratacaktır. Singletonların Ruby'de bu sorunu var mı, yoksa bir çeşit isim alanı var mıdır, böylece bir sınıf tekil olarak ifade edildiğinde, aynı iş parçacığındaki sadece tekil geri döndürülür?Tekil sınıflar, çok iş parçacıklı bir uygulamada sorunlara neden oluyor mu?

Düzenleme: Bu güncelleme yapmalarının izliyor diğer sınıflara neden güncellenen gözlemlenebilir sınıflardır netleştirmek için. Bu iş parçacığının güvenli olup olmadığından emin değilim, ama şu anda bildiğim şu ki bu gözlemlenebilir sınıfları bir ton civarında geçiyorum ve bu çok sinir bozucu. Ve doğal singleton sınıflarına benziyorlar. evreli olduğu yazılmaz

+0

Paylaşılan kapsamı (tekil veya değil) can çok dişli uygulamasında sorunlara neden olmaktadır. – R0MANARMY

+1

^bu! Singleton ruby ​​mixin kendisi "tüm örneklerde aynı örneği alırsınız, garantili" açısından güvenlidir. Michael Kohl zaten yazdı. Ancak, "sizin" tekil uygulama ipucunuzu güvende tutmak sizin sorumluluğunuzdadır. – paukul

cevap

7

Tüm sınıflar bakılmaksızın singletons da olmasak da arasında bir çok iş parçacıklı ortamda sorunlara neden olur.

sınıf varsayılan olarak paylaşılır çünkü bir tekil, sorunu daha da kötü yapabilir olması. Konu başına bir örneğiniz olamaz.

tekil devlet salt okunur ve değişmez ise bir iplik güvenlik sorunu olmayacaktır.

Paylaşılan durum değiştirilirse, iş parçacığının güvenli olduğundan emin olmanız gerekir. Bu YAGNI bir olgu gibi görünse de

+1

Immutable, bu durumda yeterince spesifik olmam. Yalnızca verilere salt okunur erişimi açıklayan, ancak altında iç durumunu değiştiren bir sınıf olabilir. İlk satır için – R0MANARMY

+0

+1. – AShelly

+1

İç durumunu değiştirirse, bu değişmez değildir. – duffymo

2

, Singleton class docs aşağıdaki thread gerektirmez ve devletler kapsamaz:

Klass._instantiate() - `` örneği’’ ya da nil dönen?. Bu kanca yöntemi, bekleme döngüsünde Klass.instance() öğesini çağıran ikinci (veya nth) bir iş parçacığı koyar. Dönüş değeri, başarılı tamamlamayı veya ilk veya daha genel olarak geçerli "somutlama iş parçacığının" erken sonlandırılmasını belirtir.

bu yardım ediyor mu?

6

Burada singelton threadafe yapma örneği var. Durumu (@things) olan ve değişmez (readonly) olmayan başka herhangi bir nesne gibi davranmalısınız. Alıcılar ve ayarlayıcılar, bir Mutex (karşılıklı dışlama) yoluyla dahili duruma erişmelidir.

require 'singleton' 

class MyObject 
    include Singleton 

    def initialize 
    @things = [] 
    @mutex = Mutex.new 
    end 

    def add(thing) 
    with_mutex { @things << thing } 
    end 

    def things 
    with_mutex { @things } 
    end 

    def clear 
    with_mutex { @things.clear } 
    end 

    def self.add(thing) 
    instance.add(thing) 
    end 

    def self.things 
    instance.things 
    end 

    def self.clear 
    instance.clear 
    end 

    private 

    def with_mutex 
    @mutex.synchronize { yield } 
    end 
end 

fazla okuma: http://rubylearning.com/satishtalim/ruby_threads.html

+1

Muteks.new'i yöntemlerle çağırmanın, iki iş parçacığının eşzamanlı olarak Mutex değişkeninin üzerine yazılmaya başlamasıyla yarış koşuluna neden olacağına inanıyorum. – Zmey

+0

@Zmey Teşekkürler - Bunu yansıtmak için kodu çözdüm :) – Kris

İlgili konular