Tengo un conjunto de preguntas relacionadas con los problemas de subprocesamiento múltiple de Java. Por favor, dame tanta ayuda como puedas.Algunas preguntas sobre multiprocesamiento en java,
0) Supongamos que tenemos 2 cuentas bancarias y tenemos que transferir dinero entre ellas de una manera segura. existen es decir
accountA.money += transferSum;
accountB.money -= transferSum;
dos requisitos:
- nadie debe ser capaz de ver los resultados intermedios de la operación (es decir, una suma acount se incrementa, pero otros aún no se disminuye)
- el acceso de lectura no debe bloquearse durante la operación (es decir, los valores antiguos de las sumas de la cuenta se deben mostrar durante la operación)
¿Puede usted sugerir algunas ideas sobre esto?
1) Supongamos que 2 hilos modifican algún campo de clase mediante un método sincronizado o utilizando un bloqueo explícito. Independientemente de la sincronización, no hay garantía de que este campo sea visible para los hilos, que lo lean a través del método NO sincronizado. - ¿es correcto?
2) ¿Cuánto tiempo se puede esperar un bloqueo provocado por el método de notificación de un bloqueo? Supongamos que tenemos un código como este:
synchronized(lock) {
lock.notifyall();
//do some very-very long activity
lock.wait() //or the end of synchronized block
}
¿Podemos decir que al menos un hilo tendrá éxito y agarrar el candado? ¿Se puede perder una señal debido a un tiempo de espera?
3) Una cita de Java concurrencia del libro:
"ejecutores de un solo subproceso también proporcionan suficiente sincronización interna para garantizar que cualquier memoria escribe hecha por tareas son visibles para las tareas subsiguientes, lo que significa que los objetos pueden ser confinado de forma segura al "hilo de tarea", aunque ese hilo pueda ser reemplazado por otro de vez en cuando ".
¿Esto significa que el único problema de seguridad de subprocesos que queda para ejecutar un código en un ejecutor de subproceso único es la carrera de datos y podemos abandonar las variables volátiles y pasar por alto todos los problemas de visibilidad? Parece una forma universal de resolver gran parte de los problemas de simultaneidad.
4) Todos los getters y setters estándar son atómicos. No necesitan sincronizarse si el campo está marcado como volátil. - ¿es correcto?
5) La iniciación de campos estáticos y bloques estáticos se realiza mediante un hilo y, por lo tanto, no es necesario sincronizar. - ¿es correcto?
6) Por qué un hilo tiene que notificar a los demás si sale el bloqueo método wait() con, pero no tiene que hacer esto si sale el bloqueo al salir del bloque sincronizado?
me gusta el hecho de que su índice cuestión comienza en 0 y no de 1 :) –
Nota rápida sobre 0) - este es un requisito común, pero normalmente se resuelve en un nivel base de datos con las transacciones, no en una aplicación nivel. Consulte http://en.wikipedia.org/wiki/Atomic_commit – Qwerky