La palabra clave sincronizada tiene dos usos. La primera es usarlo directamente en la definición del método como se presenta en el artículo "Uso de la palabra clave sincronizada para sincronizar métodos de clase". Otro tipo es el bloque sincronizado. No solo podemos sincronizar una variable de objeto a través de bloques sincronizados. También puede utilizar bloques sincronizados para sincronizar métodos estáticos y no estáticos en una clase.
La sintaxis del bloque sincronizado es la siguiente:
Copie el código de código de la siguiente manera:
método de anulación pública()
{
……
sincronizado (expresión)
{
……
}
}
1. Sincronización de métodos de clase no estáticos.
Del artículo "Uso de la palabra clave sincronizada para sincronizar métodos de clase" sabemos que el uso de la palabra clave sincronizada para definir métodos bloqueará todos los métodos estáticos o no estáticos definidos usando la palabra clave sincronizada en la clase, pero esto no es fácil de entender. Y si utiliza bloques sincronizados para lograr el mismo efecto, no es difícil entender por qué ocurre este efecto. Si desea utilizar un bloque sincronizado para bloquear todos los métodos síncronos no estáticos en una clase, debe usarlo como parámetro del bloque sincronizado y pasarlo al país del bloque sincronizado. El código es el siguiente:
Sincronizar métodos no estáticos a través de bloques sincronizados
Copie el código de código de la siguiente manera:
SyncBlock de clase pública
{
método de anulación pública1()
{
sincronizado(esto) // Equivalente a usar la palabra clave sincronizada en el método método1
{
……
}
}
método de anulación pública2()
{
sincronizado(esto) // Equivalente a usar la palabra clave sincronizada para el método método2
{
……
}
}
método vacío sincronizado público3()
{
……
}
}
En el código anterior, los bloques sincronizados se utilizan en los métodos método1 y método2. El método método3 en la línea 017 todavía usa la palabra clave sincronizada para definir el método. Cuando se utiliza la misma instancia de clase SyncBlock, mientras uno de los tres métodos se esté ejecutando, los otros dos métodos se bloquearán porque no se obtiene el bloqueo de sincronización. Para lograr el mismo efecto que la palabra clave sincronizada cuando se utiliza el bloque sincronizado, todo el código debe escribirse en el bloque sincronizado. De lo contrario, todo el código del método actual no se sincronizará con otros métodos.
Además de usar esto como parámetro del bloque sincronizado, también puede usar SyncBlock.this como parámetro del bloque sincronizado para lograr el mismo efecto.
Cuando se usa el bloque sincronizado en el método de la clase interna (InnerClass), esto solo representa la clase interna y no tiene nada que ver con la clase externa (OuterClass). Pero los métodos no estáticos de la clase interna se pueden sincronizar con métodos no estáticos de la clase externa. Por ejemplo, agregue un método método4 a la clase interna InnerClass y sincronice el método método4 con los tres métodos de SyncBlock. El código es el siguiente:
Sincronizar los métodos no estáticos de la clase interna con los métodos no estáticos de la clase externa
Copie el código de código de la siguiente manera:
SyncBlock de clase pública
{
……
claseInnerClass
{
método de anulación pública4()
{
sincronizado (SyncBlock.this)
{
……
}
}
}
……
}
En la nueva versión de la clase SyncBlock anterior, el método 4 de la clase InnerClass está sincronizado con los otros tres métodos de la clase SyncBlock. Por lo tanto, solo se puede ejecutar un método de los cuatro métodos método1, método2, método3 y método4. al mismo tiempo.
Independientemente de si el bloque sincronizado se ejecuta normalmente o sale del bloque sincronizado de manera anormal debido a un error del programa, el bloqueo de sincronización retenido por el bloque sincronizado actual se liberará automáticamente. Por lo tanto, no tiene que preocuparse por la liberación de los bloqueos de sincronización cuando utiliza bloques sincronizados.
2. Sincronización de métodos de clase estática.
Porque al llamar a un método estático, la instancia del objeto no necesariamente se crea. Por lo tanto, no puede usar esto para sincronizar métodos estáticos, pero debe usar objetos de clase para sincronizar métodos estáticos. El código es el siguiente:
Sincronizar métodos estáticos a través de bloques sincronizados
Copie el código de código de la siguiente manera:
clase pública StaticSyncBlock
{
método público vacío estático1()
{
sincronizado (StaticSyncBlock.clase)
{
……
}
}
método vacío sincronizado estático público2()
{
……
}
}
Al sincronizar métodos estáticos, puede utilizar la clase de campo estático de la clase para obtener el objeto Clase. En el ejemplo anterior, solo se puede ejecutar un método de método1 y método2 al mismo tiempo. Además de usar el campo de clase para obtener el objeto Clase, también puede usar el método getClass de la instancia para obtener el objeto Clase. El código del ejemplo anterior se puede modificar de la siguiente manera:
Utilice el método getClass para obtener el objeto Clase
Copie el código de código de la siguiente manera:
clase pública StaticSyncBlock
{
instancia pública estática de StaticSyncBlock;
bloque de sincronización estática pública()
{
instancia = esto;
}
método público vacío estático1()
{
sincronizado (instancia.getClass())
{
}
}
}
En el código anterior, una instancia de la clase StaticSyncBlock se obtiene a través de una instancia estática pública, y el objeto Clase se obtiene a través del método getClass de esta instancia (todas las instancias de una clase obtienen el mismo objeto Clase a través del método getClass, por lo tanto, llamando a cualquier Se puede utilizar el método getClass de una instancia). También podemos sincronizar métodos estáticos de diferentes clases a través de objetos Class, como el método estático de la clase Test y los dos métodos estáticos de la clase StaticSyncBlock.
El método método de la clase Test está sincronizado con los métodos método1 y método2 de la clase StaticSyncBlock.
Copie el código de código de la siguiente manera:
prueba de clase pública
{
método público estático vacío()
{
sincronizado (StaticSyncBlock.clase)
{
}
}
}
Nota: Cuando se utilizan métodos de clase de sincronización de bloques sincronizados, los métodos no estáticos pueden usar esto para sincronizar, mientras que los métodos estáticos deben usar el objeto Clase para sincronizar. No se afectan entre sí. Por supuesto, también puede utilizar objetos Class en métodos no estáticos para sincronizar métodos estáticos. Pero esto no se puede utilizar en métodos estáticos para sincronizar métodos no estáticos. Esto debe tenerse en cuenta cuando se utilizan métodos de clase de sincronización de bloques sincronizados.