Java multithreading - blocos síncronos
O bloco sincronizado Java é usado para marcar o método ou o bloco de código sincronizado. Os blocos de sincronização de Java são usados para evitar a concorrência. Este artigo apresenta o seguinte conteúdo:
Java Sincronizou Palavras -chave (sincronizadas)
Os blocos sincronizados em Java são marcados sincronizados. Os blocos de sincronização são sincronizados em um objeto em Java. Todos os blocos de sincronização sincronizados em um objeto só podem ser inseridos por um thread e executar operações ao mesmo tempo. Todos os outros threads aguardando para entrar no bloco de sincronização serão bloqueados até que os threads no bloco de sincronização sejam executados.
Existem quatro blocos de sincronização diferentes:
Os blocos de sincronização acima são todos sincronizados em diferentes objetos. Qual bloco de sincronização é realmente necessário depende da situação específica.
Método da instância Sincronização
Aqui está um método de exemplo sincronizado:
public sincronizado void add (int vale) {this.count += value; }
Sincronização do método estático
A sincronização do método estático é o mesmo que o método de sincronização do método de instância, e a palavra -chave sincronizada também é usada. A sincronização do método estático Java é o seguinte:
public static sincronizado void add (int valor) {count += value; }Da mesma forma, a palavra -chave sincronizada aqui diz a Java que esse método é sincronizado.
A sincronização de métodos estáticos refere -se à sincronização no objeto de classe onde o método está localizado. Como uma classe só pode corresponder a um objeto de classe em uma máquina virtual Java, apenas um thread pode executar métodos de sincronização estática na mesma classe.
Para métodos de sincronização estática em diferentes classes, um encadeamento pode executar métodos de sincronização estática em cada classe sem esperar. Independentemente do método de sincronização estática na classe que está sendo chamada, uma classe só pode ser executada por um thread ao mesmo tempo.
Blocos síncronos, por exemplo, métodos
Às vezes, você não precisa sincronizar todo o método, mas sincronizar parte do método. O Java pode sincronizar parte de um método.
Um exemplo de um bloco de sincronização em um método Java assíncrono é mostrado abaixo:
public void add (int vale) {sincronizado (this) {this.count += value; }}Os exemplos usam o construtor de blocos síncronos Java para marcar um pedaço de código sincronizado. Este código é o mesmo que o método de sincronização quando executado.
Observe que o construtor de bloco síncrono Java envolve o objeto entre colchetes. No exemplo acima, "isso" é usado, ou seja, a própria instância que chama o método Add. Os objetos fechados entre colchetes no construtor de sincronização são chamados de objetos de monitor. O código acima usa a sincronização do objeto Monitor e o método de instância síncrona usa a instância do próprio método de chamada como o objeto Monitor.
Apenas um thread pode executar nos métodos Java sincronizados com o mesmo objeto de monitor por vez.
Os dois exemplos a seguir sincronizam o objeto de instância que eles chamam, para que sejam equivalentes no efeito de execução sincronizado.
classe pública myclass {public sincronizado void log1 (string msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public void log2 (string msg1, string msg2) {synchronized (this) {log.writeln (msg1); log.writeln (msg2); }}}No exemplo acima, apenas um thread pode ser executado em qualquer um dos dois blocos de sincronização por vez.
Se o segundo bloco de sincronização não for sincronizado neste objeto de instância, os dois métodos poderão ser executados simultaneamente pelo thread.
Blocos síncronos em métodos estáticos
Semelhante ao exposto, os seguintes são exemplos de dois métodos estáticos de sincronização. Esses métodos são sincronizados no objeto de classe ao qual o método pertence.
classe pública myclass {public static sincronizado void log1 (string msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public static void log2 (string msg1, string msg2) {synchronized (myclass.class) {log.writeln (msg1); log.writeln (msg2); }}}Esses dois métodos não permitem acesso por threads ao mesmo tempo.
Se o segundo bloco de sincronização não for sincronizado no objeto MyClass.class. Em seguida, esses dois métodos podem ser acessados por threads ao mesmo tempo.
Instância de sincronização de Java
No exemplo a seguir, dois threads são iniciados, ambos chamando o método ADD da mesma instância da classe do contador. Como a sincronização está na instância a que o método pertence, apenas um thread pode acessar o método ao mesmo tempo.
public classe contador {long count = 0; public sincronizado void add (valor longo) {this.count += value; }} classe pública contraThread estende o thread {contador protegido = null; contrato de contrato público (contador) {this.count = contador; } public void run () {for (int i = 0; i <10; i ++) {contador.add (i); }}} public classe Exemplo {public static void main (string [] args) {contador contador = new counter (); Thread ThreadA = novo contraThread (contador); Thread Threadb = new contraThread (contador); threada.start (); Threadb.start (); }}Dois tópicos foram criados. O construtor deles se refere à mesma instância. O método contador.Add é sincronizado em uma instância porque o método Add é um método de instância e está marcado com a palavra -chave sincronizada. Portanto, apenas um thread pode chamar o método por vez. Outro tópico deve esperar até que o primeiro thread saia do método add () antes de continuar a executar o método.
Se dois threads se referirem a duas instâncias de contador diferentes, eles poderão chamar o método add () ao mesmo tempo. Esses métodos chamam objetos diferentes; portanto, esses métodos são sincronizados em diferentes objetos. Essas chamadas de método não serão bloqueadas. Conforme mostrado no exemplo a seguir:
Public classe Exemplo {public static void main (string [] args) {contador de contador = new counter (); Contador contador = new contador (); Thread ThreadA = novo contraThread (contraa); Thread Threadb = new contraThread (contrab); threada.start (); Threadb.start (); }}Observe que esses dois threads, ThreadA e ThreadB, não se referem mais à mesma instância do contador. Os métodos de adição de contraa e contrab são sincronizados no objeto ao qual eles pertencem. Chamando o método de add countera não bloqueará a chamada para o método de adição de Counterb.
O exposto acima é uma explicação do conhecimento dos blocos de sincronização Java multi-threaded. Continuaremos a adicionar informações relevantes no futuro. Obrigado pelo seu apoio a este site!