Dire che ho una matrice di migliaia di oggetti e un piccolo numero di thread che potrebbero accedere a ciascuno degli oggetti. Voglio proteggere l'accesso a uno dei metodi degli oggetti. Il modo più semplice sarebbe dichiarare tale metodo come synchronized
. Tuttavia, ciò potrebbe comportare la creazione di migliaia di monitor, indipendentemente dal modo in cui vengono implementati. Se questo fosse Win32, non creerei mai migliaia di oggetti del kernel come Mutex, ma CRITICAL_SECTIONs potrebbe essere plausibile. Mi chiedo cosa succede in Java. Data la possibilità di contesa è bassa, l'uso di monitor imporrebbe più della quantità di memoria che richiedono? Com'è diffusa la pratica di utilizzare una sincronizzazione a bassa granularità in Java?Quanto pesano i monitor Java?
(Esistono ovviamente soluzioni alternative come l'utilizzo di una matrice molto più piccola di oggetti di sincronizzazione, a cui si accederà utilizzando un hash .. Non sto cercando una soluzione pratica, sto cercando un approfondimento).
Gli oggetti Java sono dotati di un blocco leggero integrato. Questa memoria viene utilizzata indipendentemente dal fatto che si blocchi l'oggetto o meno. In breve, Java è progettato e ottimizzato per supportare il blocco di oggetti. –
10 lbs –