2011-02-07 10 views
25

Che cos'è il pool di oggetti e che cos'è un riferimento a oggetti deboli?Che cos'è il pooling di oggetti in Java?

Come possiamo implementarli utilizzando Java?

+1

(Nota, se si intende implementare una cache, evitare 'WeakReference'. Può cancellare * molto * più velocemente rispetto ai test.) –

risposta

12

Verifica commons-pool

fornisce un'API Object-pool

Esso viene generalmente utilizzato per oggetti la cui creazione è costoso. Per evitare di mantenere un pool di N oggetti pre-creati e riutilizzarli.

32

Un pool di oggetti è una raccolta di un oggetto particolare che un'applicazione creerà e manterrà a disposizione per quelle situazioni in cui la creazione di ogni istanza è costosa. Un buon esempio potrebbe essere una connessione al database o un thread di lavoro. Il pool controlla le istanze in entrata e in uscita per gli utenti come i libri fuori da una libreria.

In genere il pool di oggetti viene gestito da un server di applicazioni Java EE. Se hai bisogno di farlo da te, meglio usare qualcosa come il pool di oggetti di Apache. Non scriverne uno da solo; la sicurezza dei thread e altri problemi possono complicare le cose.

Here's un buon riferimento sui riferimenti agli oggetti deboli.

+1

Solo un piccolo commento: non è così difficile scrivere un pool. Basta applicare il modello [peso mosca] (https: //en.wikipedia.org/wiki/Flyweight_pattern) e assicurarsi di sincronizzare l'accesso al pool. Guarda l'esempio: è una buona strategia per sincronizzare _after_ hai controllato una chiave e non esisteva, e quindi controlla l'esistenza di quella chiave di nuovo _quando sincronizzata_ (poiché un altro thread potrebbe averlo inserito nel pool in quel momento) . Ciò riduce il sovraccarico dalla sincronizzazione. –

+1

Nessuno ha detto che era difficile scrivere una piscina. Molte persone lo hanno già fatto. Non ha senso farlo di nuovo a meno che tu non voglia imparare come farlo. Sottolineerò che questa risposta ha 4,5 anni. Puoi aiutare il tuo rappresentante qui molto più rispondendo a nuove domande. Sono curioso di sapere perché hai scelto la mia risposta per un commento quando tutti gli altri sono nella stessa vena. – duffymo

4

Un pool di oggetti è una raccolta di oggetti che vengono riciclati, anziché ricreati ogni volta che sono necessari.

Esistono diversi modi per implementare un pool di oggetti di questo tipo in base alle proprie esigenze. Pool di oggetti utilizzati per migliorare le prestazioni anche per oggetti semplici ma non altrettanto utili in Java 5+.

Suggerisco di usarli solo per oggetti che si collegano a risorse esterne come file, socket o connessioni database.

+1

"non così utile in Java 5+." perché? –

+0

In Java 5.0, la creazione e la raccolta di oggetti era molto più efficiente, rendendo i pool di oggetti più costosi che utili in molti casi per i pool di oggetti semplici. Per i pool di oggetti ultra leggeri, possono comunque essere utili per le prestazioni e la riduzione del GC. –

1

Pooling & pool di oggetti:

Pooling in pratica significa utilizzare le risorse in modo efficiente, limitando l'accesso degli oggetti da solo il periodo il cliente lo richiede.

L'aumento dell'utilizzo attraverso il pool di solito aumenta le prestazioni del sistema.
Il pool di oggetti è un modo per gestire l'accesso a un insieme finito di oggetti tra i client concorrenti.
In altre parole, il pool di oggetti non è altro che la condivisione di oggetti tra diversi client.

Poiché il pool di oggetti consente la condivisione di oggetti, gli altri client/processi devono riattivare l'oggetto (che diminuisce il tempo di caricamento), invece possono utilizzare un oggetto esistente.
Dopo l'utilizzo, gli oggetti vengono restituiti al pool.


Debole oggetto campione:

Un riferimento debole è un supporto per un riferimento a un oggetto chiamato referente.
Con i riferimenti deboli è possibile mantenere un riferimento al referente senza impedirne il recupero.
Quando il garbage collector traccia l'heap se gli unici riferimenti in sospeso a un oggetto sono riferimenti deboli, il referente diventa candidato per GC come se non ci fossero riferimenti in sospeso e tutti i riferimenti deboli in sospeso vengano cancellati.

Ricorda, GC sempre, utilizzando alcuni algoritmi, reclamare gli oggetti debolmente raggiungibili.

5

Un riferimento debole è un tipo di variabile di riferimento che viene trattata appositamente dal garbage collector.

Questo introduce un altro tipo di raggiungibilità, qualsiasi oggetto può essere:

  • fortemente raggiungibile (raggiungibile da qualsiasi thread vita solo normali riferimenti)
  • debolmente raggiungibile (non forte raggiungibile, ma raggiungibile un riferimento debole (o da molteplici modi, ciascuno dotato di un riferimento debole))
  • non raggiungibili affatto

(Ci sono anche Riferimenti morbide e Phantom Riferimenti, che lascio qui fuori -. Funzionano in modo simile e introducono più livelli tra)

Se un oggetto non è raggiungibile a tutti, può essere garbage collection in ogni momento. Se un oggetto è fortemente raggiungibile, non può essere assolutamente raccolto. Se il garbage collector rileva che un oggetto (o un gruppo di oggetti) è debolmente raggiungibile (forse con più riferimenti deboli), cancella tutti questi riferimenti contemporaneamente allo e quindi gli oggetti non sono raggiungibili (e possono essere spazzatura- raccolto).

(In realtà non v'è/può essere un passo finalizzazione tra il "non raggiungibile" e la collezione, che può anche rendere l'oggetto di nuovo raggiungibile.)

Per usare i riferimenti deboli, è possibile utilizzare la classe java.lang.ref.WeakReference - il riferimento effettivo è in una variabile privata di questa classe e può essere impostato solo con il costruttore e successivamente cancellato. È possibile eseguire la sottoclasse di questa classe, se sono necessari altri dati oltre al riferimento stesso, che dovrebbe comunque essere presente quando il riferimento viene cancellato.

Per un pool di oggetti nel senso di "evitare costose operazioni di istanziazione", un riferimento debole non è lo strumento giusto.

0

Ho implementato un semplice ObjectPool in Java, vedere qui Tuttavia non utilizza riferimenti agli oggetti deboli. Scopo del riferimento a oggetti deboli per consentire di raccogliere una memoria oggetto anche se ci sono riferimenti all'oggetto, ma sono deboli. È più utile per le cache che per i pool di oggetti, sebbene possa essere utilizzato anche per loro.

2

L'idea del modello di pool di oggetti è simile a quella della libreria. Ognuno di noi sa che è più economico e più facile andare in una biblioteca e prendere in prestito un libro invece di acquistarlo. Allo stesso tempo, è più economico (per quanto riguarda la memoria e la velocità del sistema) che un processo prenda in prestito un oggetto anziché istanziarlo. Quindi tale processo in cui un processo prende in prestito un oggetto da un altro processo è definito come pool di oggetti.