2009-08-24 12 views
7

Non durante l'istanziazione, ma una volta eseguita l'istanziazione dell'oggetto Singleton, cosa succederà se due o più thread stanno tentando di accedere allo stesso oggetto Singleton? Soprattutto nel caso in cui l'oggetto singleton impieghi molto tempo per elaborare la richiesta (diciamo 1 minuto) ... In questo caso, se per esempio, 5 thread cercano di accedere allo stesso oggetto Singleton, quale sarà il risultato?cosa succede se più thread tentano di accedere all'oggetto singleton

domanda supplementare: normalmente quando dovremmo andare per il modello singleton e quando dovremmo evitarlo?

+1

La risposta alla tua domanda così com'è, è "dipende davvero". Che tipo di singleton? cioè, cosa fa e come lo fa? E in che lingua? –

risposta

5

A meno che non si esegua la sincronizzazione (blocco) all'interno di Singleton, la risposta è questa: è una soluzione gratuita per tutti.

Sebbene il Singleton garantisca l'utilizzo di una sola istanza di un oggetto quando richiesto, il pattern stesso non fornisce intrinsecamente alcuna forma di sicurezza del thread. Questo è lasciato al implementatore.

Nel caso specifico citato (con un metodo a esecuzione prolungata), sarebbe fondamentale sincronizzare l'accesso a qualsiasi metodo che utilizza variabili di classe o a livello di oggetto. In caso contrario, con ogni probabilità porterebbe a condizioni di gara.

Buona fortuna!

+0

Bene, più in generale, il singleton deve essere protetto da thread. Il blocco è una possibilità, ma lo è anche l'apolidia. –

0

Un singleton non è diverso da qualsiasi altro oggetto diverso da una sola istanza. Ciò che accade quando si tenta di accedervi dipenderà in gran parte da ciò che i thread di accesso stanno tentando (ad esempio, leggi contro scrivere) e dal tipo di dati che il tuo singleton detiene.

0

La risposta alla tua domanda così com'è, è "dipende davvero". Che tipo di singleton? cioè, cosa fa e come lo fa? E in che lingua?

La realtà è che il singleton patter) n impone e impone solo che è possibile avere solo un'istanza di un determinato oggetto. Di per sé non dice nulla su più thread che accedono a quell'oggetto.

Quindi, se codificato a destra (con sincronizzazione dei thread implementata correttamente) non c'è motivo per cui non dovrebbe comportarsi correttamente - anche se le richieste all'oggetto impiegano molto tempo per l'elaborazione!

2

La regola generale che uso per Singletons è che non dovrebbe influire sul codice in esecuzione e non ha effetti collaterali. Essenzialmente per me, nei miei progetti questo si traduce in qualche tipo di funzionalità di logging, o ricerca di valori statici (cioè caricare alcuni dati comuni da un database una volta e conservarli per riferimento in modo da non doverli leggere ogni volta che è necessario) .

0

Quindi è necessaria l'implementazione thread safe del modello singleton.

Trova articolo this utile per lo stesso che descrive la maggior parte dello scenario multi-threading del modello singleton.

HTH!

+0

Si noti che le risposte di solo collegamento sono scoraggiate, quindi le risposte dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un'altra sosta di riferimenti, che tende a diventare obsoleta nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

Problemi correlati