A sincronização de threads java está fundamentalmente alinhada com uma lógica: Adicione Lock -------> Modify --------> Lanking Lank
1. Sincronizar blocos de código
Exemplos são os seguintes:
classe pública SyncBlock {classe estática datawrap {int i; } classe estática SyncBlockThread estende o thread {Data do DataWrap privado; public SyncBlockThread (DataWrap DataWrap) {this.date = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {sincronizado (date) {date.i ++; tente {dormir (1); } catch (interruptedException e) {e.printStackTrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// Variável de implementação multi-thread I Adiciona uma saída na sequência datawrap datawrap = new datawrap (); novo syncblockThread (datawrap) .start (); novo syncblockThread (datawrap) .start (); novo syncblockThread (datawrap) .start (); }}No exemplo, você deseja produzir números inteiros em sequência.
Geralmente, os blocos de código síncrono são objetos que precisam ser bloqueados e geralmente são recursos compartilhados que exigem acesso simultâneo. Qualquer thread primeiro bloqueia o recurso antes de modificar o recurso especificado. Durante o período de bloqueio, outros threads não podem modificar o recurso. Isso garante a segurança dos threads. Além disso, o thread não desistirá do bloqueio de recursos ao ligar para o sono ou o rendimento.
2. Método de sincronização
classe pública SyncMethod {classe estática datawrap {int i; public sincronizado void valueGrow () {i ++; tente {thread.sleep (1); } catch (interruptedException e) {// TODO BLOCO DE CATCH AUTOGERATIDO E.PRINTSTACKTRACE (); } System.out.println (thread.currentThread (). GetName () + "" + i); }} classe estática syncmethodThread estende o thread {datawrap datawrap; public syncmethodThread (datawrap datawrap) {this.datawrap = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {datawrap.valueGrow (); }}} public static void main (string [] args) {// implementa crescimento seqüencial e saída i datawrap datawrap = new datawrap (); novo syncmethodThread (datawrap) .start (); novo syncmethodThread (datawrap) .start (); novo syncmethodThread (datawrap) .start (); }}O método de sincronização é um método modificado pela palavra -chave sincronizada. O método de sincronização bloqueia o próprio objeto. Portanto, quando um encadeamento chama o método de sincronização de um determinado objeto, se outros threads chamam outros métodos de sincronização do objeto, eles ainda precisam esperar para liberar a trava do objeto porque o objeto foi bloqueado.
3. Lock síncrono
A sincronização é alcançada definindo um objeto de bloqueio de sincronização; nesse caso, o bloqueio de sincronização usa um objeto de bloqueio para atuar como.
importar java.util.concurrent.locks.lock; importar java.util.concurrent.locks.reentrantlock; public class synclock {classe estática datawrap {bloqueio = new reentrantlock (); int i; public void ValueGrow () {Lock.lock (); tente {i ++; tente {thread.sleep (1); } catch (interruptedException e) {// TODO BLOCO DE CATCH AUTOGERATIDO E.PRINTSTACKTRACE (); } System.out.println (thread.currentThread (). GetName () + "" + i); } finalmente {Lock.unlock (); }}} classe estática synclockthread estende o thread {datawrap datawrap; public synclockthread (datawrap datawrap) {this.datawrap = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {datawrap.valueGrow (); }}} public static void main (string [] args) {// implementa crescimento seqüencial e saída i datawrap datawrap = new datawrap (); novo synclockthread (datawrap) .start (); novo synclockthread (datawrap) .start (); novo synclockthread (datawrap) .start (); }}O uso de objetos de bloqueio para implementar a sincronização do encadeamento será mais flexível. Algumas bloqueios também possuem algumas funções específicas, entre as quais a mais comumente usada ReadWritelock Read and Write Locks, e o ReentrantLock pode entrar novamente na trava.