Pregunta

¿Qué es la exclusión mutua y semáforo en Java? ¿Cuál es la principal diferencia?

¿Fue útil?

Solución

semáforo se puede contar, mientras mutex sólo puede contar hasta 1.

Suponga que tiene una ejecución hilo que acepta conexiones de clientes. Este hilo puede manejar 10 clientes al mismo tiempo. A continuación, cada nuevo cliente establece el semáforo hasta llegar a 10. Cuando el semáforo tiene 10 banderas, a continuación, el hilo no aceptará nuevas conexiones

mutex se utilizan por lo general de la custodia de las cosas. Supongamos sus 10 clientes pueden acceder a múltiples partes del sistema. A continuación, puede proteger una parte del sistema con un mutex para que cuando 1 cliente está conectado a ese subsistema, nadie más debe tener acceso. Puede utilizar un semáforo para este propósito también. Un mutex es un "Exclusión Mutua Semáforo" .

Otros consejos

Por desgracia, todo el mundo ha perdido la diferencia más importante entre el semáforo y la exclusión mutua; el concepto de " propiedad ".

Los semáforos no tienen noción de propiedad, esto significa que cualquier tema puede liberar un semáforo (esto puede conducir a muchos problemas en sí, sino puede ayudar con la "detección de la muerte"). Mientras que un mutex tiene el concepto de propiedad (es decir, sólo se puede liberar una exclusión mutua que han adquirido).
La propiedad es muy importante para la programación segura de los sistemas concurrentes. Yo siempre recomiendo el uso de exclusión mutua con preferencia a un semáforo (pero hay implicaciones de rendimiento).

objetos mutex también puede apoyar la herencia de prioridad (que puede ayudar con el problema de inversión de prioridad) y recursión (eliminando un tipo de punto muerto).

También hay que señalar que hay semáforos "binario" y "contar los semáforos / generales". semáforo de Java es un semáforo de cuenta y por lo tanto permite que se inicializa con un valor mayor que uno (mientras que, como se señaló, un mutex sólo puede un recuento conceptual de uno). La utilidad de esto se ha señalado en otros puestos.

Para resumir, a menos que tenga múltiples recursos para gestionar, siempre recomendaría el mutex sobre el semáforo.

mutex es básicamente la exclusión mutua. Sólo un hilo puede adquirir el recurso a la vez. Cuando un hilo adquiere el recurso, no se permite ningún otro hilo para adquirir el recurso hasta que el hilo poseer las liberaciones de recursos. Todos los subprocesos en espera para la adquisición de recursos serían bloqueados.

Semáforo se utiliza para controlar el número de hilos de ejecución. No se fijará conjunto de recursos. La voluntad recuento de recursos se decrementa cada vez que un hilo es propietaria de la misma. Cuando el recuento de semáforo alcance 0, entonces no hay otros hilos se les permite adquirir el recurso. Los hilos se bloquean hasta que otros hilos que poseen comunicados de recursos.

En resumen, la principal diferencia es cuántos hilos están autorizados a adquirir el recurso a la vez?

  • mutex --su UNO.
  • Semáforo - su DEFINED_COUNT, (tantos como recuento de semáforos)

Un mutex se utiliza para acceder a un recurso de serie, mientras que un semáforo límites de acceso a un recurso, hasta un número determinado. Se puede pensar en un mutex como un semáforo con un recuento de acceso 1. Lo que se establece su recuento de semáforos para que puedan hilos pueden acceder al recurso antes de que el recurso está bloqueado.

Un semáforo es un mecanismo de sincronización de conteo, un mutex no lo es.

A mutex es a menudo conocido como un semáforo binario. Mientras que un semáforo se puede crear con cualquier no-cero contar un mutex es conceptualmente un semeaphore con un recuento superior de 1.

Esta pregunta tiene respuestas pertinentes y enlace a la guía oficial de Java: ¿Hay un mutex Java?

objeto mutex es semáforo binario. Debe ser inicializado con 1, por lo que el primero que llega se cumple principio. Esto nos lleva a la otra propiedad especial de cada mutex: el que hizo por , debe ser el que hace a . Ergo hemos obtenido la exclusión mutua sobre algún recurso.

Ahora se podía ver que un mutex es un caso especial de semáforo en general.

El objeto de sincronización Semáforo implementa un semáforo clásica. A los controles del semáforo acceso a un recurso compartido por un contador. Si el contador es mayor que cero, se concede el acceso; Si es cero, se deniega el acceso. El contador cuenta los permisos que permiten el acceso al recurso compartido. A continuación, para acceder al recurso, un hilo debe recibir permiso del semáforo. En general, para usar un semáforo, el hilo que quiere tener acceso al recurso compartido intenta adquirir un permiso. Si el recuento de semáforo es mayor que cero, el hilo adquiere un permiso, y el recuento semáforo se decrementa. De lo contrario, el hilo se bloquea hasta que se pueda obtener un permiso. Cuando el hilo ya no necesita tener acceso al recurso compartido, se libera el permiso, por lo que se incrementa el recuento de semáforo. Si hay otro hilo a la espera de un permiso, adquiere un permiso en ese momento. La clase Semáforo de Java implementa este mecanismo.

Semáforo tiene dos constructores:

Semaphore(int num)
Semaphore(int num, boolean come)

num especifica el conteo inicial del permiso. Entonces num especifica el número de hilos que pueden acceder a un recurso compartido en un momento dado. Si num es uno, se puede acceder al recurso de un hilo a la vez. Al establecer venga como verdadero, se puede garantizar que los hilos que están esperando se les concede el permiso en el orden que solicitaron.

Semáforo :

  

Un semáforo de conteo. Conceptualmente, un semáforo mantiene un conjunto de permisos. Cada bloques acquire() si es necesario hasta que un permiso está disponible, y luego se lo lleva. Cada release() añade un permiso, lo que podría liberar un bloqueo adquirente. Sin embargo, no se usan los objetos de permisos reales; El semáforo sólo mantiene un recuento del número disponible y actúa en consecuencia.

Semáforos a menudo se utilizan para restringir el número de hilos que se puede acceder a algunos recursos (físico o lógico)

Java API no tiene objeto mutex incorporado. Pero puede ser implementado como semáforo binario.

  

Un semáforo inicializado a uno, y que se utiliza tal que sólo tiene a lo sumo un permiso disponible, puede servir como un bloqueo de exclusión mutua. Esto es más comúnmente conocido como un semáforo binario, ya que sólo tiene dos estados: un permiso disponibles, o cero permisos disponibles.

Cuando se utiliza de esta manera, el semáforo binario tiene la propiedad (a diferencia de muchas implementaciones de bloqueo), que el "bloqueo" puede ser liberado de un hilo que no sea el propietario (como semáforos no tienen noción de propiedad) . Esto puede ser útil en algunos contextos especializados, tales como la recuperación de interbloqueo.

diferencias clave entre semáforo y objeto mutex:

  1. Semáforo restringir el número de hilos para acceder a un recurso throuhg permisos. Mutex permite sólo un hilo a recursos de acceso.

  2. No hay hilos posee semáforo. Los temas pueden actualizar número de permisos llamando a métodos acquire() y release(). Mutex deben ser desbloqueados sólo por el hilo que mantiene el bloqueo.

  3. Cuando un mutex se utiliza con variables de condición, hay un horquillado-it implícita está claro qué parte del programa se está protecte d. Esto no es necesariamente el caso de un semáforo, lo que podría llamarse la A de la programación concurrente -es potente pero muy fácil de utilizar de forma no estructurada, indeterminado.

Se trata de comparar lo incomparable, técnicamente no hay diferencia entre un semáforo y la exclusión mutua que no tiene sentido. Mutex es sólo un nombre significativo como cualquier nombre en la lógica de la aplicación, significa que se inicializa un semáforo en posición "1", se utiliza generalmente para proteger un recurso o una variable protegida para garantizar la exclusión mutua.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top