2010-10-14 13 views
5

Lea que el interbloqueo puede ocurrir en un solo programa de subprocesos de Java. Me pregunto cómo ya que no habrá ninguna competencia después de todo. Por lo que puedo recordar, los libros ilustran ejemplos con más de un hilo. ¿Puedes dar un ejemplo si puede suceder con un solo hilo?Interbloqueo en un solo programa de subprocesos Java

Respuesta

0

No.

interbloqueo es el resultado de múltiples hilos (o procesos) que intentan adquirir bloqueos de tal manera que ni puede continuar.

Considérese una cita del artículo de Wikipedia: (http://en.wikipedia.org/wiki/Deadlock)

"Cuando dos trenes se aproximan entre sí en un cruce, tanto vendrá a un punto y no se pondrá en marcha de nuevo hasta que el otro se ha ido."

+0

Múltiples hilos o * procesos * .... – NVRAM

+0

Buen punto Carter. He editado mi comentario. Gracias. – philipk

+0

Sí, bueno, múltiples (es decir, más de 0) subprocesos, de eso es de lo que estamos hablando. – Ingo

0

No, suena bastante imposible para mí.

Pero en teoría podría bloquear un recurso del sistema, mientras que otra bloquea otro que va a solicitar y esa aplicación va a solicitar la que ya ha bloqueado. Bang Deadlock.

Pero el sistema operativo debería ser capaz de solucionar este problema al detectarlo y otorgar ambos recursos a una aplicación en ese momento. Las posibilidades de que esto ocurra son prácticamente nulas, pero cualquier buen sistema operativo debería ser capaz de manejar esta probabilidad de uno en mil millones.

Si realiza el diseño cuidadosamente y solo bloquea un recurso a la vez, esto no puede suceder.

+0

¿Por qué el voto a favor? Esta respuesta es precisa sobre una cosa que podría suceder una vez en mil millones. – Frank

+0

No te voté, pero casi lo hice. Su segundo párrafo es correcto, por lo tanto, la posibilidad de que esto ocurra es muy alta si el diseño de la aplicación funciona de la manera que usted describe. Entonces, su 3er párrafo es "incorrecto" (para la mayoría de los recursos en la mayoría de los sistemas operativos). Después de todo, ** ¿qué haría exactamente el sistema operativo para evitar el punto muerto? ** – NVRAM

+0

Y su tercer párrafo supone que la aplicación puede lograr sus objetivos con un solo recurso, lo que simplemente no funciona para una gran cantidad de problemas. – NVRAM

6

Es una cuestión de cómo definir exactamente "interbloqueo".

Por ejemplo, este escenario es algo realista: una aplicación de subproceso único que utiliza una cola de tamaño limitado que bloquea cuando se alcanza su límite. Mientras no se alcance el límite, esto funcionará bien con un solo hilo. Pero cuando se alcanza el límite, el hilo esperará por siempre que un otro hilo (no existente) tome algo de la cola para que pueda continuar.

+3

No creo que esto sea un punto muerto. O bien 'while (true) {}' es un punto muerto – Bozho

+0

@Bozho Es un bloque, no un punto muerto, pero 'while (true)' no tiene nada que ver con eso. – EJP

1

Bueno, yo se atreven a decir que sí

Si intenta adquirir la misma cerradura dentro del mismo hilo de forma consecutiva, que depende del tipo de bloqueo o bloqueo de aplicación si se comprueba si el bloqueo se accede por el mismo hilo. Si la implementación no verifica esto, tiene un punto muerto.

Para sincronizado, esto está marcado, pero no pude encontrar la garantía para Semaphore.

Si usa otro tipo de cerradura, debe verificar la especificación de cómo se comporta.

Además, como ya se ha señalado, puede bloquear (que es diferente de interbloqueo) leyendo/escribiendo en un búfer restringido. Por ejemplo, escribe cosas en un búfer ranurado y solo lee en ciertas condiciones. Cuando ya no pueda insertar, espere hasta que se libere una ranura, lo que no sucederá ya que usted mismo realiza la lectura.

Así que me atrevería a decir que la respuesta debería ser sí, aunque no tan fácil y generalmente más fácil de detectar.

hth

Mario

2

Antes de procesadores multinúcleo se convirtieron barato, todos los ordenadores de sobremesa tenían procesadores de un solo núcleo. Los procesadores de un solo núcleo se ejecutan solo en el hilo. Entonces, ¿cómo funcionaba el multihilo? La implementación más sencilla para Java sería: Código

de Thread1:

doSomething(); 
yield(); // may switch to another thread 
doSomethingElse(); 

código de thread2:

doSomething2(); 
yield(); // may switch to another thread 
doSomethingElse2(); 

Esto se conoce como el multithreading cooperativa - todo está hecho con sólo 1 hilo, y así multihilo era hecho en Windows 3.1.

Hoy en día, el subprocesamiento múltiple denominado subprocesamiento preventivo es solo una ligera modificación del multitomaco cooperativo donde este rendimiento() se llama automáticamente de vez en cuando.

Todo lo que puede reducir a las siguientes entrelazamientos:

doSomething(); 
doSomething2(); 
doSomethingElse2(); 
doSomethingElse(); 

o:

doSomething(); 
doSomething2(); 
doSomethingElse(); 
doSomethingElse2(); 

Y así sucesivamente ... Hemos convertido código multiproceso al código de un solo subproceso. Entonces sí, si también es posible un interbloqueo en programas multiproceso en un único subproceso. Por ejemplo:

Thread1:

queue.put(x); 
yield(); 

thread2:

x = queue.waitAndGet() 
yield(); 

Está bien con esta entrelazado:

queue.put(x); 
x = queue.waitAndGet() 

Pero aquí tenemos estancamiento:

x = queue.waitAndGet() 
queue.put(x); 

Así que sí, los bloqueos son posibles en los programas de un solo subproceso.

+0

Muy buen punto –

+0

¿No sucedería ese punto muerto cada vez? – Frank

+0

Con esos 2 'hilos' y rendimiento() ocurrirá al azar, con los sistemas operativos modernos (que no usan rendimiento() sino subprocesamiento) funcionarán, con la segunda solución de subproceso único, el interbloqueo ocurrirá siempre, simplemente reemplace mis métodos 'queue.xxxx()' con los métodos apropiados de BlockingQueue. El hilo pensará que espera otro hilo mientras espera por sí mismo. :-) – iirekm

1

Incluso si su materia java es un único subproceso todavía hay señal de manipuladores, que se ejecutan en un subproceso diferente/contexto que el hilo principal.

Por lo tanto, un estancamiento de hecho puede ocurrir incluso en las soluciones de un solo subproceso, si/cuando Java se ejecuta en Linux.

QED. -pbr

+0

+1 no pensé en las señales! –

-1

En realidad, es bastante fácil:

BlockingQueue bq = new ArrayBlockingQueue(1); 
bq.take(); 

habrá un punto muerto.

+0

Esto no es un punto muerto. Es un bloque. – EJP

+0

@EJP Nitpicking. El hilo que hace esto está muerto. Tan fácil. – Ingo

Cuestiones relacionadas