La investigación principal sobre las características de ReadWriteLock en este artículo, como sigue.
Readlock y Readlock no son mutuamente excluyentes
Readlock y WriteLock son mutuamente excluyentes
WriteLock y Readlock son mutuamente excluyentes
WRITELOCK y WRITELOCK son mutuamente excluyentes
Tema 1, Get Readlock Primero, Thread 2 intenta obtener Readlock, puede obtener el subproceso 1, obtener Readlock Primero, Thread 2 intenta obtener WriteLock, bloquear y esperar, y puede obtener el Hilo 1 hasta que el hilo 1 libera el bloqueo del Bloqueo, y puede obtener el hilo 1, obtener WriteLock primero, hilo 1, obtener primero Writelock primero, hilo 2 TRIES para obtener WRITELOCK, bloquear y esperar y esperar el hilo 1. Hilo 1. Hilo 1.
paquete com.alio.lock; import java.text.simpledateFormat; import java.util.date; import java.util.concurrent.lock.lock; import java.util.concurrent.locks.readwriteLock; import java.util.concurrent.locks.reentranTranTriTelock;/** * */pública Class {static simpledateFormat sdf = new SimpleDateFormat ("yyyyy-mm-dd hh: mm: ss.sss"); public static void main (string [] args) {data data = new data (); trabajador t1 = nuevo trabajador (datos, falso);//escribe trabajador t2 = nuevo trabajador (datos, verdadero); // Worker T3 = New Worker (Data, verdadero); t1.start (); t2.start (); t3.start ();} El trabajador de clase estática extiende el hilo {data data; boolean read; public worker (datos de datos, lectura booleana) {this.data = data; this.read = read;} public void run () {if (lectura) data.read (); else data.Write ();}} Datos de clase estática {readWriteLock Lock = new ReEnTrantReadWriteLock (); Lock Read = Lock.Readlock (); Lock Write = Lock.WriteLock (); public void Write () {intente {hilt.sleep (2000); //} Catch (Exception e) {} Write.Lock () (System.Println (HiltlnttHeadtHeadtHeadtHead. + "escribir: begin" + sdf.format (new Date ())); try {Thread.sleep (5000); //} Catch (Exception e) {} Finalmente {System.out.println (Thread.CurrentThread () + "Write: End" + SDF.Format (New Date ())); Write.unlock ();}} Intre Read () {read.lock (); system.out.println (thread.currentThread () + "read: begin" + sdf.format (new date ())); intente {thread.sleep (5000); //} catch (excepción e) {} finalmente {system.println (hilo.currentThread () + "Read: end" + sdf.format (format (format (format (format (format (format ( Date ())); read.unlock ();} return 1;}}}Thread [Thread-2,5, Main] Lea: Begin 2018-01-22 13: 54: 16.794
Thread [Thread-1,5, Main] Lea: Begin 2018-01-22 13: 54: 16.794
Thread [Thread-2,5, Main] Leer: Fin 2018-01-22 13: 54: 21.795
Thread [Thread-1,5, Main] Leer: Fin 2018-01-22 13: 54: 21.795
Thread [Thread-0,5, Main] Escribir: Begin 2018-01-22 13: 54: 21.795
Thread [Thread-0,5, Main] Escribir: Fin 2018-01-22 13: 54: 26.795
Se iniciaron tres hilos al mismo tiempo, entre los cuales el hilo No. 1 Hilo Thread[Thread-0,5,main], y duerme durante 2 segundos al ejecutar escritura. Luego, el hilo n. ° 2, el hilo n. ° 3 Thread[Thread-1,5,main],Thread[Thread-2,5,main] priorizará la ejecución del código
read.lock ();
Desde read.lock(); no es mutuamente excluyente (puede ser reentrante), han obtenido el bloqueo al mismo tiempo, lo que se puede ver a través del registro
Thread [Thread-2,5, Main] Lea: Begin 2018-01-22 13: 54: 16.794Tread [Thread-1,5, Main] Leer: Comienzo 2018-01-22 13: 54: 16.794
Y su gastos generales del tiempo de ejecución es el mismo (el código de prueba está durmiendo durante 5 segundos), por lo que la ejecución también terminará al mismo tiempo.
Thread [Thread-2,5, Main] Lea: Fin 2018-01-22 13: 54: 21.795Tread [Thread-1,5, Main] Leer: Fin 2018-01-22 13: 54: 21.795
Solo cuando se lanzan todos los readlocks pueden obtener el bloqueo. En este momento, el bloqueo se lanzará después de la ejecución del hilo [Thread-1,5, Main] y el hilo [Thread-2,5, Main] se lanzará.
Entonces, Thread[Thread-0,5,main] obtuvo WriteLock y ejecutó su propio código comercial en este momento
Thread [Thread-0,5, Main] Escribir: Begin 2018-01-22 13: 54: 21.795Thread [Thread-0,5, Main] Escribir: Fin 2018-01-22 13: 54: 26.795
Lo anterior se trata de la prueba de ejemplo de Java Language ReadWriteLock, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!