Acerca de la sincronización multiproceso de Java
Usemos un ejemplo sencillo para hacer un análisis comparativo. El trabajo a realizar en el ejemplo es muy simple, es crear un hilo y cada hilo imprime el número desde hasta. Esperamos que no haya una impresión desordenada intercalada entre hilos, sino una impresión secuencial.
Veamos el primer fragmento de código. Aquí, agregamos la palabra clave sincronizada en el método run(), con la esperanza de tener acceso mutuamente exclusivo al método de ejecución, pero el resultado no es el que esperábamos. Esto se debe a que el bloqueo de sincronización aquí es este objeto, es decir, se ha creado un subproceso en el código del objeto de subproceso actualmente en ejecución. Cada subproceso mantiene el bloqueo de objeto de este objeto y no se puede lograr la sincronización del subproceso.
¿Código? ¿Vista del paquete? La clase MyThread implementa Java lang Runnable { private int threadId
public MyThread(int id) {? this threadId = id}
@ Anular ejecución vacía sincronizada pública(){? for(int I =; i lt; i) { Sistema fuera println(ID de hilo: este ID de hilo: I);? } }?}
Clase pública ThreadDemo { /**? * @param argumentos? * @throws ¿Excepción interrumpida? */public static void main(String[]args) lanza InterruptedException {? for(int I =;i lt;I){ nuevo hilo (nuevo Mi hilo (I)) inicio(); hilo dormido();? } }?}
A partir del fragmento de código anterior, podemos saber que para lograr la sincronización de subprocesos, estos subprocesos deben competir por un bloqueo de objeto único.
Basándonos en esta idea, modificamos el primer fragmento de código de la siguiente manera. Antes de crear el hilo de inicio, primero creamos un objeto Objeto utilizado por los hilos competidores y luego pasamos la referencia de este objeto Objeto a la variable miembro de bloqueo de cada objeto de hilo, de modo que el miembro de bloqueo de cada hilo apunte al mismo Objeto. objeto. Usamos un bloque de sincronización para bloquear parcialmente el objeto de bloqueo en el método de ejecución, de modo que los subprocesos puedan competir por este bloqueo de objeto único para lograr la sincronización.
¿Código? Vista del paquete
Clase MyThread implementa Java lang Runnable { private int threadId; bloqueo de objeto privado
public MyThread(int id Object obj){? este hiloId = identificación? Este bloqueo = obj}
@Override public void run() {? sincronizado(bloqueo){ para(int I =; i lt; i) {? Salida del sistema println(ID de hilo: este ID de hilo: I);}?} }?}
Clase pública ThreadDemo { /**? * @param argumentos? * @throws ¿Excepción interrumpida? */public static void main(String[]args) lanza InterruptedException {? Objeto obj = nuevo Objeto();? for(int I =;I lt;I){ new Thread(new MyThread(I obj))start();Thread Sleep();? } }?}
A partir del segundo fragmento de código, podemos saber que la clave de la sincronización es que varios objetos de subproceso compiten por el mismo * * * recurso compartido. En el código anterior, el recurso compartido se crea externamente y luego se pasa al hilo. También podemos aprovechar el hecho de que todas las instancias de la clase comparten las variables miembro de la clase, de modo que los objetos miembro estáticos se pueden usar para implementar bloqueos. El código es el siguiente.
¿Código? Vista del paquete
Clase MyThread implementa Java lang Runnable { private int threadId; bloqueo de objeto estático privado = nuevo objeto ();
public MyThread(int id) {? este threadId = id}
@Override public void run() {? sincronizado(bloqueo){ para(int I =; i lt; i) {? Salida del sistema println(ID de hilo: este ID de hilo: I);}?} }?}
Clase pública ThreadDemo { /**? * @param argumentos? * @throws ¿Excepción interrumpida? */public static void main(String[]args) lanza InterruptedException {? for(int I =;i lt;I){ nuevo hilo (nuevo Mi hilo (I)) inicio(); hilo dormido();? } }?}
Veamos el primer fragmento de código. Agregar la palabra clave sincronizada a un método de ejemplo bloquea este objeto en sí, mientras que agregar la palabra clave sincronizada a un método estático bloquea la clase misma. Los métodos estáticos son compartidos por todos los objetos de instancia de clase, por lo que los objetos de subproceso se excluyen mutuamente al acceder a este método estático. De esta manera, el código de sincronización de subprocesos se puede implementar de la siguiente manera.
¿Código? Vista del paquete
La clase MyThread implementa Java lang Runnable { private int threadId
public MyThread(int id) {? este threadId = id}
@Override public void run() {? controlador de tareas (este threadId);}
Sincronización estática privada void taskHandler (int threadId) {? for(int I =; i lt; i) { Sistema fuera println(ID de hilo: threadId: I);? } }?}
Lishi Xinzhi/Article/program/Java/gj/201311/27441