Este artículo presenta algunos puntos de conocimiento sobre las palabras clave sincronizadas en Java Multithreading como bloqueos de objetos.
El llamado bloqueo del objeto significa sincronizado para bloquear un cierto objeto. Como referencia, consulte: este artículo
1. Análisis
Sincronized puede modificar el método de instancia de la siguiente manera:
clase pública myObject {sincronizado public void Methoda () {// haz algo ....}Aquí, la palabra clave sincronizada bloquea el objeto actual. Esto también se llama bloqueo de objeto.
¿Por qué bloquear el objeto actual? Debido a que MethodA () es un método de instancia, si desea ejecutar MethodA (), debe llamarlo en forma de objeto. método () (obj.methoda (), obj es un objeto de la clase myobject, sincronizada significa bloquear el objeto obj).
El código anterior también se puede escribir así:
clase pública myObject {public void MethodA () {Synchronized (this) {// Do algo ....}}2. Características
Una característica obvia de la sincronización de palabras clave sincronizada es que cuando se definen múltiples métodos de instancia modificados sincronizados en la clase MyObject, si múltiples hilos tienen el mismo objeto de la clase MyObject, estos métodos solo se pueden ejecutar de manera sincrónica. Es decir, después de ejecutar un método de modificación sincronizado, se puede ejecutar otro método de modificación sincronizado.
como sigue:
clase pública myObject {sincronizado public void Methoda () {// Do Something ...} Synchronized public void Methodb () {// haz alguna otra cosa}}Hay dos métodos de modificación sincronizados en la clase MyObject.
public class Thinda extiende el hilo {objeto privado myobject; // omitir el constructor @Override public void run () {super.run (); objeto.methoda (); }}Hush a ejecuta MethodA ()
public class Threadb extiende hilo {objeto privado myobject; // omitir el constructor @Override public void run () {super.run (); objeto.methodb (); }} Thread B ejecuta métodosb ()
public class run {public static void main (string [] args) {myObject Object = new MyObject (); // El hilo A y el hilo B sostienen el mismo objeto: Object Thraina a = New Threada (Object); Threadb b = new Threadb (objeto); A.Start (); B.Start (); }}Dado que el hilo A y el hilo B sostienen el objeto objeto de la misma clase MyObject, aunque estos dos hilos deben llamar a diferentes métodos, deben sincronizarse. Por ejemplo, el subproceso B debe esperar a que Thread A ejecute el método MethodA () antes de poder ejecutar el método Methodb ().
3. Conclusión
Como se puede ver de lo anterior, el alcance del bloqueo sincronizado descrito en este artículo es todo el objeto. Si hay múltiples métodos de sincronización modificados sincronizados en una clase, y múltiples hilos contienen el mismo objeto de la clase (el mismo objeto de la clase), aunque llaman métodos diferentes, la ejecución de cada método también se sincroniza.
Si no hay variables compartidas entre cada método sincronizado, o no hay conexión entre cada método, pero solo se puede ejecutar sincrónicamente, esto afectará la eficiencia.
4. Aplicación: use sincronizado para evitar leer datos sucios debido a la inconsistencia de los datos
El siguiente ejemplo:
clase pública myObject {private String UserName = "B"; String private Password = "BB"; Methoda sincronizado de public Void (String UserName, String Password) {this.Username = UserName; intente {Thread.sleep (5000); } Catch (InterruptedException e) {} this.password = contraseña; } sincronizado public void Methodb () {System.out.println ("UserName" + UserName + ":" + "Passwase" + Password); }}MethodA () es responsable de cambiar el nombre de usuario y la contraseña. En realidad, un nombre de usuario corresponde a una contraseña.
Methodb () es responsable de leer el nombre de usuario y la contraseña.
Si Methodb () no se modifica con sincronizado, enhebra un cambio de usuario al llamar a MethodA () a la línea 7, y abandona la CPU por alguna razón (como dormir en la línea 9).
En este momento, si Thread B ejecuta Methodb (), el nombre de usuario lectura es el nombre de usuario cambiado por Thread A ("A"), pero la contraseña es la contraseña original ("BB"). Porque el hilo A está durmiendo y no ha tenido tiempo de cambiar la contraseña.
Sin embargo, si Methodb () se modifica con sincronizado, entonces el subproceso B solo puede esperar a que el subproceso A sea completo de ejecución (es decir, ha cambiado el nombre de usuario y la contraseña) antes de ejecutar Methodb para leer el nombre de usuario y la contraseña. Por lo tanto, se evitan los problemas de lectura sucio causados por la inconsistencia en los datos.
Lo anterior se trata de este artículo, espero que sea útil para todos aprender la programación de Java.