java - lock - synchronized android
Sincronizado Vs Semaphore (3)
También hay una palabra clave
volatile
, de acuerdo con http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html acceso a las variablesvolatile
es más eficiente que acceder a estas variables a través del código sincronizadojava.util.concurrent.Semaphore
se utiliza para restringir el número de subprocesos que pueden acceder a un recurso. Es decir, mientras quesynchronized
permite que solo un hilo adquiera el bloqueo y la ejecución del bloque / método sincronizado, el Semáforo otorga permiso para que n subprocesos y bloquee los demás.
Mientras leo la concurrencia en Java, tengo las siguientes dudas:
¿Java proporciona una construcción de nivel inferior y luego se sincroniza para la sincronización?
En qué circunstancias utilizaremos el semáforo sobre sincronizado (lo que proporciona el comportamiento del monitor en Java)
Sincronizado permite que solo un hilo de ejecución acceda al recurso al mismo tiempo. Semaphore permite hasta n (puedes elegir n) hilos de ejecución para acceder al recurso al mismo tiempo.
También hay atomics . Esto le da acceso al comando básico de comparación e intercambio de hardware que es la base de toda la sincronización. Te permite, por ejemplo, incrementar un número de manera segura. Si usted ++
un campo volátil, otro hilo que ejecuta la misma instrucción podría leer el campo antes de que el hilo lo escriba, y luego escribir de nuevo después de su hilo. Así que un incremento se pierde. La atómica hace la lectura y la escritura "atómicamente" y así evita el problema.
En realidad, los volátiles, las declaraciones sincronizadas y los atómicos tienden a obligar a que todos los datos de subprocesos se actualicen desde la memoria principal y / o se escriban en la memoria principal según corresponda, por lo que ninguno de ellos es realmente tan bajo. (Estoy simplificando aquí. A diferencia de C #, Java no tiene realmente un concepto de "memoria principal".)