Este artigo apresenta alguns pontos de conhecimento sobre palavras -chave sincronizadas no Java Multithreading como bloqueios de objetos.
O chamado bloqueio de objeto significa sincronizado para bloquear um determinado objeto. Para referência, consulte: Este artigo
1. Análise
Sincronizado pode modificar o método da instância da seguinte forma:
public class MyObject {sincronizada public void Metoda () {// Faça algo ....}Aqui, a palavra -chave sincronizada bloqueia o objeto atual. Isso também é chamado de bloqueio de objeto.
Por que bloquear o objeto atual? Como o método () é um método de instância, se você deseja executar o MethodA (), precisará chamá -lo na forma de objeto. Método () (obj.methoda (), OBJ é um objeto da classe MyObject, sincronizado significa travar o objeto OBJ).
O código acima também pode ser escrito assim:
public class MyObject {public void Methoda () {sincronizado (this) {// Faça algo ....}}2. Recursos
Um recurso óbvio da sincronização de palavras -chave sincronizadas é que, quando vários métodos de instância modificados sincronizados são definidos na classe MyObject, se vários threads tiverem o mesmo objeto da classe MyObject, esses métodos só podem ser executados de maneira síncrona. Ou seja, após a execução de um método de modificação sincronizado, outro método de modificação sincronizado pode ser executado.
do seguinte modo:
public class MyObject {sincronizada public void methodA () {// Faça algo ....} Sincronizado public void methodB () {// Faça outra coisa}}Existem dois métodos de modificação sincronizados na classe MyObject.
classe pública threada estende thread {objeto privado myObject; // omita o construtor @Override public void run () {super.run (); object.Methoda (); }}Thread A Executa Methoda ()
classe pública threadb estende thread {private myObject objeto; // omita o construtor @Override public void run () {super.run (); object.MethodB (); }} O thread B executa o métodob ()
public class Run {public static void main (string [] args) {myObject objeto = new MyObject (); // thread a e thread b segure o mesmo objeto: objeto threada a = new threada (objeto); Threadb B = new ThreadB (objeto); a.start (); b.start (); }}Como o thread A e o thread B seguram o objeto da mesma classe MyObject, embora esses dois threads precisem chamar métodos diferentes, eles devem ser sincronizados. Por exemplo, o encadeamento B precisa aguardar o thread a para executar o método MethodA () antes de executar o método MethodB ().
3. Conclusão
Como pode ser visto no exposto, o escopo da trava sincronizada descrita neste artigo é o objeto inteiro. Se houver múltiplos métodos de sincronização modificados sincronizados em uma classe, e vários threads mantêm o mesmo objeto da classe (o mesmo objeto da classe), embora eles chamam métodos diferentes, a execução de cada método também será sincronizada.
Se não houver variáveis compartilhadas entre cada método sincronizado, ou não houver conexão entre cada método, mas só pode ser executado de maneira síncrona, isso afetará a eficiência.
4. Aplicação-use sincronizado para evitar a leitura de dados sujos devido à inconsistência de dados
O exemplo a seguir:
classe pública myObject {private string userName = "b"; private string senha = "bb"; Public Syncronized Public void Metoda (String Username, String senha) {this.username = nome de usuário; tente {thread.sleep (5000); } catch (interruptedException e) {} this.password = senha; } Public Syncronized public void methodB () {System.out.println ("nome de usuário" + nome de usuário + ":" + "senha" + senha); }}Methoda () é responsável por alterar o nome de usuário e a senha. Na realidade, um nome de usuário corresponde a uma senha.
Methodb () é responsável por ler o nome de usuário e a senha.
Se o MethodB () não for modificado com sincronizado, Thread A altera o nome de usuário ao chamar Methoda () para a linha 7 e desiste da CPU por algum motivo (como dormir na linha 9).
No momento, se o thread B executar o métodob (), o nome de usuário é o nome de usuário alterado pelo thread a ("a"), mas a senha é a senha original ("bb"). Porque o thread A está dormindo e não teve tempo de alterar a senha.
No entanto, se o MethodB () for modificado com sincronizado, o encadeamento B só pode aguardar a execução do Thread A para concluir (ou seja, ele mudou o nome do usuário e a senha) antes de executar o MethodB para ler o nome e a senha do usuário. Portanto, os problemas de leitura sujos causados pela inconsistência nos dados são evitados.
O exposto acima é tudo sobre este artigo, espero que seja útil para todos aprenderem a programação Java.