¿Qué opciones tengo para hacer que un hilo de ByteBuffer sea seguro? Se sabe que no es seguro para subprocesos ya que la posición de la caja fuerte, el límite y algunos (¿todos?) Dependen de este estado interno.Opciones para hacer que el hilo ByteBuffer de Java sea seguro
Para mis propósitos, será suficiente si varios hilos de lectura son seguros, pero para otros visitantes futuros me gustaría saber qué técnicas/trucos/trampas necesito saber para que sean completamente seguros para hilos.
Lo que tengo en mente:
- Sincronización o el uso de bloqueos ReadWrite para todos los métodos. Probablemente el enfoque más lento (?)
- Subclase de ByteBuffer y evitar persistencia de estado ligado a hilos como posición etc. Y lanzando excepciones en consecuencia para todos los métodos que necesiten usar el estado interno. Este sería el ayuno Pero, ¿hay trampas? (excepto que tendré que leer la memoria directamente mapeada en la memoria del montón ...)
¿Qué otros trucos podría utilizar? ¿Cómo podría, por ejemplo, implementar un "clonar bytes en lectura" con DirectBuffer - ¿es posible? ¿Sería posible dividir el ByteBuffer completo (ByteBuffer.slice) en una sola solución?
actualización: ¿Qué se entiende en este question con "duplicado (mientras sincronizada) para obtener una nueva instancia apunta a los mismos bytes asignados"
Prefiero usar un modelo de actor en el que cualquier ByteBuffer se actualiza por un solo hilo (o es de solo lectura). La razón por la que hago esto es porque descubrí que la sobrecarga de la sincronización generalmente supera los beneficios de tener múltiples hilos. –
gracias, peter! ¿Estás usando esto a través de una rebanada? o ¿cómo se accede a la misma información? – Karussell
No uso un corte, en cambio uso un envoltorio que lo oculta todo (incluso el hecho de que estoy usando ByteBuffers y es posible que desee cambiar a Inseguro, que es un poco más rápido). La ventaja de usar un envoltorio es que puedes ocultar todo los detalles y acceda a su "matriz" de forma natural llamando a métodos. Esto es particularmente útil ya que tengo matrices con miles de millones de elementos que no caben en un solo ByteBuffer. –