5

Mi programa tiene un hilo de renderizado OpenGL y un hilo de modificación de datos. El subproceso de representación accede a los datos en un conjunto de ArrayLists, mientras que el subproceso de modificación de datos altera, elimina y agrega objetos a los ArrayLists. Los hilos se actualizan aproximadamente 60 veces por segundo, y la manipulación de ArrayList es el cuello de botella del programa. Intenté sincronizar bloques (super lento), CopyOnWriteArrayLists (bastante lento) y crear ArrayLists en el subproceso (menos de tres males). ¿Cuál es la "mejor" forma de obtener la máxima eficacia de ArrayLists concurrentes?Java: ¿Cuál es la forma más eficiente de sincronizar una ArrayList?

+1

Necesita contar más sobre el algoritmo y la topología de la "manada de ArrayLists". – jmg

+1

¿Ha considerado aprovechar 'ConcurrentHashMap' o' ConcurrentSkipListMap/Set'? –

+1

¿ha mirado el paquete java.util.concurrent como una alternativa para sincronizar bloques? – Yoni

Respuesta

1

El mejor mecanismo es hacer su trabajo en las operaciones de hilo y cola GL que se ejecutarán. Si solo hay un solo subproceso que acceda a la lista, no hay problema.

+0

¿Por qué es mejor migrar la lógica del programa al hilo gl? –

+1

Estás haciendo mucking con el estado GL. Todo el estado mucking-about-with debería hacerse en el hilo GL. Simple como eso. –

+0

Acabo de comenzar a programar GL hace 3 días. Voy a leer sobre los estados GL. Pero incluso cuando el programa era Java Swing, la esencia del problema sigue siendo la misma, ¿no? No intenté que esto fuera una pregunta específica de GL. –

3
List<YourObject> syncList = Collections.synchronizedList(yourList); 
+4

Estoy extremadamente cansado de esta solución. En primer lugar, la colección debe sincronizarse manualmente cuando se usa el iterador, y también puede haber otros problemas. Creo que esto es un problema con la lógica del programa. –

+2

Esto le da una solución general de todo o nada, mientras que la cuestión es tratar de lograr una mayor granularidad de bloqueo – Yoni

+1

-1 Esto no responde la pregunta en absoluto. De hecho, el uso de Collection.synchronized * siempre es la forma más barata e ineficiente, y muchas veces incorrecta, de sincronizar en una colección. Aunque ocasionalmente puede "hacer el trabajo", solo es bueno usarlo cuando el trabajo realmente no importa. –

Cuestiones relacionadas