Quali opzioni devo rendere sicuro un thread ByteBuffer? È noto che non è thread-safe poiché mette in sicurezza posizione, limite e alcuni metodi (/ all?) Dipendono da questo stato interno.Opzioni per rendere sicuro il thread di ByteBuffer di Java
Per i miei scopi sarà sufficiente se più thread di lettura sono sicuri, ma per altri futuri visitatori mi piacerebbe sapere quali tecniche/trucchi/trappole devo sapere per renderlo completamente sicuro.
Quello che ho in mente:
- Sincronizzazione o utilizzando serrature ReadWrite per tutti i metodi. Probabilmente l'approccio più lento (?)
- Sottoclasse ByteBuffer ed evitare lo stato persistente legato al thread come posizione ecc. E generare eccezioni di conseguenza per tutti i metodi che devono utilizzare lo stato interno. Questo sarebbe il digiuno. Ma ci sono trappole? (eccetto che dovrò leggere la memoria mappata direttamente nella memoria dell'heap ...)
Quali altri trucchi posso usare? Come potrei ad esempio implementare un "clone bytes on read" con DirectBuffer - è possibile a tutti? Probabilmente affettare l'intero ByteBuffer (ByteBuffer.slice) in una soluzione?
Aggiornamento: cosa si intende in questo question con "duplicato (mentre sincronizzato) per ottenere una nuova istanza indicando gli stessi byte mappati"
Preferisco utilizzare un modello di attore in cui qualsiasi ByteBuffer viene aggiornato da un solo thread (o è di sola lettura). Il motivo per cui lo faccio è che ho riscontrato che il sovraccarico della sincronizzazione supera di solito i vantaggi di avere più thread. –
grazie, peter! stai usando questo attraverso una fetta? o come accedi agli stessi dati? – Karussell
Non uso una slice, invece utilizzo un wrapper che nasconde tutto (anche il fatto che sto usando ByteBuffers e potrei voler passare a Unsafe che è leggermente più veloce) Il vantaggio di usare un wrapper è che puoi nascondere tutto i dettagli e accedi al tuo "array" in modo naturale chiamando metodi. Ciò è particolarmente utile in quanto ho array con miliardi di elementi che non rientrano in un singolo ByteBuffer. –