5

Il mio programma ha un thread di rendering openGL e un thread di modifica dati. Il thread di rendering accede ai dati in un branco di ArrayList, mentre il thread di modifica dei dati altera, rimuove e aggiunge oggetti agli ArrayList. I thread si aggiornano circa 60 volte al secondo e la manipolazione di ArrayList è il collo di bottiglia del programma. Ho provato i blocchi di sincronizzazione (super slow), CopyOnWriteArrayLists (abbastanza lento) e la creazione di buffer ArrayList nel thread di rendering (minore di tre mali). Qual è il modo "migliore" per ottenere la massima efficienza dalle ArrayList concorrenti?Java: qual è il modo più efficiente per sincronizzare un ArrayList?

+1

È necessario aggiungere ulteriori informazioni sull'algoritmo e sulla topologia del "gruppo di elenchi di array". – jmg

+1

Avete preso in considerazione l'uso di 'ConcurrentHashMap' o' ConcurrentSkipListMap/Set'? –

+1

hai guardato il pacchetto java.util.concurrent come alternativa ai blocchi di sincronizzazione? – Yoni

risposta

1

Il meccanismo migliore è eseguire il lavoro nelle operazioni di thread GL e di coda da eseguire. Se c'è sempre un solo thread che accede all'elenco, non ci sono problemi.

+0

Perché è meglio migrare la logica del programma nel gl thread? –

+1

Stai scherzando con lo stato GL. Tutto lo stato del mucking-about-with dovrebbe essere fatto nel thread GL. Semplice come quella. –

+0

Ho appena iniziato a programmare GL circa 3 giorni fa. Leggerò su GL states. Ma anche quando il programma era Java Swing, l'essenza del problema rimane la stessa, no? Non intendevo che questa fosse una domanda specifica per GL. –

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

Sono molto stanco di questa soluzione. Prima di tutto, la raccolta deve essere sincronizzata manualmente quando viene utilizzato l'iteratore e potrebbero esserci anche altri problemi. Penso che questo sia un problema con la logica del programma. –

+2

Questa soluzione offre una soluzione tutto-o-niente, dove la domanda riguarda il tentativo di ottenere una granularità più elevata del blocco. – Yoni

+1

-1 Questo non risponde affatto alla domanda. Infatti, l'uso di Collection.synchronized * è sempre il modo più economico e inefficiente e spesso non corretto per sincronizzarsi su una raccolta. Sebbene possa occasionalmente "portare a termine il lavoro", è utile solo quando il lavoro non ha molta importanza. –

Problemi correlati