Sincronización en colecciones sincronizadas-> problema de rendimiento

Basado en las respuestas a continuación: Todavía no está claro para mí: ¿Qué hace la construcción sincronizada en el Mapa concurrente, si es que lo hace? es decir, en el caso de un mapa concurrente, ¿cuál es la diferencia, si hay alguna, entre sincronizado (mapa) versus no sincronizado? No estoy interesado en la corrección o creí la bondad de la solución . Solo una respuesta a la pregunta: P: ¿Cuál es la diferencia entre sincronizar en un mapa concurrente y no sincronizar en el mismo? Específicamente con respecto al rendimiento ... será suficiente. Nada mas por favor.
Solo estoy interesado en lo que sucede y no hay consejos adicionales.

Tengo una pregunta teórica que tengo un problema mental que resolver: suponga que tengo una clase de colección concurrente say => ConcurrentHashMap map;

Supongamos que tengo tres métodos:

method1: synchronized(map){
       doSomethingWithThemap(); //Assume put integers 1.. 1000000
}

method2:doSomethingWithThemap(); //Note it is not synchronized 
method3:doSomethingElseWithThemap(); //Assume put integers 2000000.. 3000000

Ahora suponga 2 TestCases:


  • TestCase1: Genera dos hilos A y B. A llama al método1 y B llama al método3.
  • TestCase2: Genera dos hilos A 'y B'. A 'llama al método2 y B' llama al método3.

Desde el punto de vista del rendimiento, esperaría que TestCase2 ganara, ya que por lo que entiendo, en TestCase1 B no se puede agregar al mapa, aunque sea concurrente, ya que el bloque sincronizado mantendrá el bloqueo en el mapa, y este no es el caso en TestCase2.

Mis pruebas unitarias NO validan esta hipótesis.

P: ¿Qué me estoy perdiendo aquí? es decir, dado un bloque sincronizado en una colección concurrente, ¿se ve afectado el rendimiento?

Respuesta 1

No tiene garantía de que ConcurrentHashMap use su instancia como monitor. ¡Puede usar otro objeto para bloquear!

private Object lock = new Object();

synchronized(lock) {
   // do some stuff - you can't get my lock because it is private
}

Incluso es posible que ConcurrentHashMap no use bloqueos, sino algunas otras primitivas de concurrencia como comparar y establecer, semáforos, etc.

Los bloqueos en Java son reentrantes, por lo que si ya tiene un bloqueo, no se bloqueará.

Respuesta: 2

ConcurrentHashMap no está utilizando sincronizado ... Sin embargo, sigue siendo seguro para subprocesos, pero obtener llamadas, por ejemplo, no bloquea nada. Las estructuras de datos concurrentes son bastante agradables e interesantes. Bueno, utiliza cierto bloqueo interno bajo ciertas circunstancias, pero no nada que esté expuesto, y ciertamente no expone el monitor del objeto en sí.

Por cierto. Medir el rendimiento de código concurrente como este es bastante complicado y variará de una ejecución a otra y de la computadora, pero de todos modos es principalmente defectuoso.

Pero, de lo contrario, podría funcionar teóricamente como lo describe si utiliza un hashmap sincronizado. Collections.synchronizedMap(yourMap);

Respuesta: 3

en Java SWING, la tecla "Tab" transfiere globalmente el foco entre todos los componentes. ¿Es posible modificar este comportamiento "predeterminado" de alguna manera? Entonces, en lugar de hacer que la tecla "Tab" cambie el foco, quiero ...

Considere este ejemplo: <% int testNumber = 1; %> // Algunos HTML van aquí <% = testNumber%> Me sale un error de compilación: testNumber no se puede resolver en una variable ¿Alguien puede explicar qué es ...

Me preguntaba si alguien sabe cómo eliminar una lista de cambios vacía del rendimiento a través de la API p4java. ¡Gracias!

Así que soy bastante nuevo en Java y especialmente en Eclipse, así que disculpe mi ignorancia. Tomé un proyecto de un servidor y lo copié localmente en mi máquina. Cuando abrí el espacio de trabajo, tuve muchos errores ...