Cuando vi por primera vez esta pregunta, no pude comenzar porque sentí que los sincronizados y el bloqueo eran muy diferentes en términos de bloqueo. Por ejemplo, vea cómo bloquear cuando se sincroniza en circunstancias normales.
Método 1:
Public sincronizado void a () {// todo}Método 2:
public void b () {sincronizado (this) {// tODO}}A partir de estas dos maneras, el bloqueo se agrega entre {}. Echemos un vistazo a cómo se hace el bloqueo:
public void c () {Lock.lock (); intente {// tODO} finalmente {Lock.unlock (); }}Esta forma de bloqueo se agrega entre bloqueo () y desbloquear (). Por lo tanto, si desea implementar una función de bloqueo, debe pensar en cómo implementar estos dos métodos, bloquear () y desbloquear () métodos, primero defina un marco de la siguiente manera:
public void Lock () {} public void desbloock () {}Luego debe pensar en cómo usar sincronizado para implementar estos dos métodos.
Ahora soy un poco más claro en mi mente, pero no sé cómo llenar estos dos métodos. Aquí le mostramos cómo analizar las características del bloqueo de Lock, y luego echar un vistazo a este código:
public void c () {Lock.lock (); // Cuando el subproceso actual obtiene el bloqueo, otro hilo tiene que esperar, intente {// el subproceso actual en el bloqueo, otro subproceso no puede entrar // todo} finalmente {lister.unlock (); // hilo actual libera el bloqueo}}Acabo de agregar un pequeño comentario sobre este código y no hice nada más. ¿Está ayudando a comprender este código y ver cuál es la palabra más frecuente, CurrentThread? Entonces, cuando llenamos los métodos Lock () y Desbloquear (), ¿deberíamos prestar atención a captar la palabra clave actual para encontrar la solución? La respuesta es sí.
Luego analice, ¿cómo hacer que el hilo espere cuando use sincronizado? Es para usar el método Wait (). ¿Cómo despertar el hilo? Utiliza el método Notify (). Luego debe usar el método Wait () en el método Lock () y el método Notify () en el método desbloqueo (). Entonces, cuando usamos Wait () y notificar (), tenemos una condición. ¿Piensa en qué debemos usar como condición?
Deberíamos usar si el bloqueo actual está ocupado como condición de juicio. Si la cerradura está ocupada, la actualización actual espera. Piense en si hemos estado usando esta condición cuando usamos sincronizado. La respuesta es sí.
Analicemos cuándo liberar el bloqueo y qué condiciones se usan. Piense en si el hilo A obtiene el bloqueo, ¿se puede liberar el hilo B? Por supuesto que no. Si se puede liberar B, viola el principio, por supuesto que no. Definitivamente es que la cerradura de hilo A solo se puede lanzar. Por lo tanto, la condición de juicio es juzgar si el hilo que sostiene el bloqueo es actual. Si es así, se puede lanzar, pero, por supuesto, no puede.
Echemos un vistazo al código completo ahora:
paquete test.lock; import java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.threadFactory; public class NaViveLock {private estático final no = -1; propietario de larga duración = ninguno; sincronizado void lock () {long currentThreadID = thread.currentThread (). {Wait ();} Catch (InterruptedException e) {E.PrintStackTrace ();}} propietario = currentThreadID; system.out.println (string.Format ("Lock se adquiere por hilo %s", propietario));} public sincronizado sincronizado sincronizado () {if (! this.islooked () || propietario! = hilo. IllegalStateException("Only Lock owner can unlock the lock");}System.out.println(String.format("thread %s is unlocking", owner));System.out.println();owner = NONE;notify();}public static void main(String[] args) {final NaiveLock lock = new NaiveLock();ExecutorService executor = Ejecutors.newFixedThreadPool (20, new ThreadFactory () {private ThreadGroup Group = new ThreadGroup ("Test Thread Group"); {Group.SetDaemon (true);}@anular public thread NewThread (runnable r) {return New Thread (grupo, r);}}); para (int i = 0; i <20; i ++) {ejecutor corre. {@Override public void run () {Lock.lock (); System.out.println (String.Format ("Thread %S está ejecutando ...", Thread.CurrentThread (). {E.PrintStackTrace ();} Lock.unlock ();}});}}}Ejecutarlo y ver los resultados:
El bloqueo de la cerradura se adquiere por el subproceso 8 subproceso 8 está funcionando ... el hilo 27 está esperando el hilo de bloqueo 26 está esperando el hilo de bloqueo 25 está esperando el hilo de bloqueo 24 está esperando el hilo de bloqueo de bloqueo 23 está esperando el hilo del bloqueo 22 El hilo de bloqueo de la mierda 21 está esperando el rostro de bloqueo de bloqueo 20 está esperando el rostro de bloqueo 19 de bloqueo de la mierda de bloqueo de bloqueo de la mierda de bloqueo. 27 thread 27 is running... thread 27 is unlocking Lock is acquired by thread 26 thread 26 is running... thread 26 is unlocking Lock is acquired by thread 25 thread 25 is running... thread 25 is unlocking Lock is acquired by thread 24 thread 24 is running... thread 24 is unlocking Lock is acquired by thread 23 thread 23 is running... thread 23 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 22 is unlocking Lock is acquired by thread 21 thread 21 is running... thread 21 is unlocking Lock is acquired by thread 20 thread 20 is running... thread 20 is unlocking Lock is acquired by thread 19 thread 19 is running... thread 19 is unlocking Lock is acquired by thread 18 thread 18 is running... thread 18 is unlocking Lock is acquired by thread 17 thread 17 is running... thread 17 is unlocking Lock is acquired by thread 16 thread 16 is running... thread 16 is unlocking Lock is acquired by thread 15 thread 15 is running... thread 15 is unlocking Lock is acquired by thread 14 thread 14 is running... thread 14 is unlocking Lock is acquired por hilo 13 hilo 13 se ejecuta ... el hilo 13 es el bloqueo de desbloqueo de desbloqueo se adquiere por hilo 12 hilo 12 se ejecuta ... el hilo 12 es el bloqueo de desbloqueo de desbloqueo se adquiere mediante el subproceso 11 hilo 11 se ejecuta ... el hilo 11 se desbloquea el bloqueo se adquiere por hilo 10 hilo 10 se ejecuta ... el hiled
Si cambia el bucle for a 30 veces, mire los resultados:
El bloqueo de la cerradura se adquiere por el subproceso 8 subproceso 8 está funcionando ... el hilo 27 está esperando el hilo de bloqueo 26 está esperando el hilo de bloqueo 25 está esperando el hilo de bloqueo 24 está esperando el hilo de bloqueo de bloqueo 23 está esperando el hilo del bloqueo 22 El hilo de bloqueo de la mierda 21 está esperando el rostro de bloqueo de bloqueo 20 está esperando el rostro de bloqueo 19 de bloqueo de la mierda de bloqueo de bloqueo de la mierda de bloqueo. 27 hilo 27 se ejecuta ... el hilo 8 está esperando el bloqueo de bloqueo 27 se desbloquea el bloqueo de desbloqueo se adquiere por hilo 27 hilo 27 se ejecuta ... el hilo 26 está esperando el bloqueo de bloqueo 27 es el bloqueo de desbloqueo de bloqueo se adquiere por hilo 27 hilo 27 se ejecuta ... el subproceso 25 está esperando el hilo de bloqueo 27 El bloqueo de la cerradura de la mierda de hilo de hilo de hilo de hilo de hilo de hilo de hilo de hilo de hilo 22. is waiting lock thread 22 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 21 is waiting lock thread 22 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 20 is waiting lock thread 22 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 19 is waiting lock thread 22 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 18 is waiting lock thread 22 is unlocking Lock is acquired by thread 17 thread 17 is running... thread 17 is unlocking Lock is acquired by hilo 16 hilo de hilo 16 se ejecuta ... el hilo 16 se desbloquea el bloqueo se adquiere por hilo 15 hilo 15 se ejecuta ... el hilo 15 se desbloquea el bloqueo se adquiere por hilo 14 hilo 14 14 se ejecuta ... el hilo 14 se adquiere bloqueo de bloqueo de hilo 13 hild 13 hilt 13 se ejecuta ... el hilo 13 bloqueo el bloqueo de bloqueo de hilo de hilo de hilo de hilo de hilo de hilo. by thread 9 thread 9 is running... thread 9 is unlocking Lock is acquired by thread 8 thread 8 is running... thread 8 is unlocking Lock is acquired by thread 26 thread 26 is running... thread 26 is unlocking Lock is acquired by thread 25 thread 25 is running... thread 25 is unlocking Lock is acquired by thread 27 thread 27 is running... thread 27 is unlocking Lock is acquired by thread 24 thread 24 is running... thread 24 is unlocking Lock is acquired by thread 23 thread 23 is running... thread 23 is unlocking Lock is adquirido por hilo 21 hilo 21 se ejecuta ... el hilo 21 es el bloqueo de desbloqueo se adquiere por hilo 20 hilo 20 se ejecuta ... el hilo 20 es el bloqueo de desbloqueo se adquiere por hilo 19 hilo 19 se ejecuta ... el hilo 19 es el bloqueo de desbloqueo se adquiere por hilo 18 hilo 18 se ejecuta ... el hilo 18 se está desbloqueando
Resumir
Lo anterior es toda la explicación detallada de este artículo sobre el uso de sincronizado para implementar un código de bloqueo. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
Ejemplo de código de bloqueo de sincronización de sincronización de hilo Java
La diferencia entre sincronizado y bloqueo en la programación de Java [recomendado]
Código de implementación de separación de lectura de lectura de lectura múltiple de Java.
Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!