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
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."
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.
¿Por qué el voto a favor? Esta respuesta es precisa sobre una cosa que podría suceder una vez en mil millones. – Frank
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
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
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.
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
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.
Muy buen punto –
¿No sucedería ese punto muerto cada vez? – Frank
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
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
+1 no pensé en las señales! –
- 1. Ejemplo de interbloqueo de subprocesos en C#
- 2. 'Interbloqueo' con solo un objeto bloqueado?
- 3. Programa de servidor de subprocesos múltiples en Java
- 4. ¿Es posible crear un interbloqueo con acceso de solo lectura?
- 5. Cómo matar subprocesos bloqueados en Java?
- 6. Agregar recursivamente subprocesos a un grupo de subprocesos de Java
- 7. Interbloqueo en el subproceso de Python popen
- 8. sobreasignación de subprocesos de subprocesos de Java
- 9. pthread_mutex_lock provoca un interbloqueo
- 10. Ejecutar un programa Java de nuestro programa Java
- 11. Grupo de subprocesos en Java
- 12. "todos los goroutines están dormidos - interbloqueo! Exit estado 2" error en un programa receptor de impresora
- 13. ¿Puede llamar a WSAStartup() desde varios subprocesos para provocar un interbloqueo?
- 14. Java Grupo de subprocesos en caché y subprocesos local
- 15. Esperando múltiples subprocesos para completar en Java
- 16. Interbloqueo en SELECCIONAR/ACTUALIZAR
- 17. paralelismo de ForkJoinPool = 1 interbloqueo
- 18. Sincronización en subprocesos para Java
- 19. comunicación entre subprocesos en java
- 20. cómo descargar un solo archivo con varios subprocesos en C#
- 21. Interbloqueo SQLServer
- 22. Interbloqueo en concurrent.futures código
- 23. Interrumpir subprocesos enlazados en Java
- 24. ¿Cómo identifico un interbloqueo en SQL Azure?
- 25. muestra de interbloqueo en .net?
- 26. Afinidad de subprocesos de Java
- 27. Cuando ejecuto un programa Java de subproceso único, ¿por qué hay varios subprocesos en el nivel del sistema operativo?
- 28. Obtener el número de subprocesos RTS en el programa Haskell?
- 29. interbloqueo en sincronizado (Interno de cadena())
- 30. Interbloqueo en código de ruby con SizedQueue
Múltiples hilos o * procesos * .... – NVRAM
Buen punto Carter. He editado mi comentario. Gracias. – philipk
Sí, bueno, múltiples (es decir, más de 0) subprocesos, de eso es de lo que estamos hablando. – Ingo