Threads são um conceito muito importante na programação Java. Este artigo irá explicá-lo em detalhes na forma de exemplos. A análise específica é a seguinte:
Em primeiro lugar, qual é a utilidade do bloqueio de thread? Por exemplo: Por exemplo, se você tem 30.000 yuans no banco agora e vai ao banco para sacar o dinheiro, depois de inserir a senha, você já inseriu o valor do saque. Por exemplo, se você inseriu 20.000, ele. significa que o banco vai buscar o dinheiro para você. Naquela época, sua esposa também foi ao banco sacar o dinheiro e você. Minha esposa também saca 20.000, porque sua conta ainda está com 30.000 no momento, então o banco realiza a mesma operação por parte de sua esposa. Dessa forma, depois que vocês dois concluírem suas respectivas operações, o banco ainda deverá ter 30.000 registrados em sua conta. .Um depósito de 10.000 yuans, não é ótimo? Para resolver este problema, é utilizado o conhecimento de thread locking. Vamos aprender juntos.
1. Um exemplo de sincronização de thread não tratada:
public class TextSync implements Runnable{ /**Sincronização de thread não tratada* @param args */ Time time = new Time(); (texto); Tópico t2 = novo Tópico(texto); t1.setName("t1"); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName() }}class Time { private static int num = 0; try { num++; //Quando o primeiro thread é executado até este ponto, num se torna 1, e o primeiro thread faz uma pausa por um segundo. //Quando o segundo thread é executado até este ponto, num Torna-se 2. e o segundo thread faz uma pausa por um segundo. //O número do primeiro thread também se torna 2 neste momento, então o resultado final é 2; " é o "+num+"th thread de execução.");Resultado de saída:
t2 é o segundo thread de execução. t1 é o segundo thread de execução.
2. Sincronização de threads
public class TextSynctwo implementa Runnable{ /**Sincronização de thread* @param args */ Time1 time = new Time1(); texto);Tópico t2 = novo Tópico(texto);t1.setName("t1"); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); sincronizado bloqueia o thread atual, que pode ser declarado quando o método é definido ou definido no método. public sincronizado void add(String name){ //synchronized (this) {//Bloqueia o thread atual para evitar que ele seja executado por outros threads try { num++; . printStackTrace(); } System.out.println(name+"é o "+num+"th thread de execução.");Resultado de saída:
t1 é o primeiro thread de execução. t2 é o segundo thread de execução.
3. Impasse
classe pública TestDeadLock implementa Runnable{ /**Deadlock* @param args */ private int flag = 0; {TestDeadLock td1 = novo TestDeadLock(); = 1;td2.flag = 2;Tópico t1 = novo Tópico t2 = novo Tópico(t1.setName("t1"); ;t2.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()); if(flag == 1){ sincronizado(o1){ try { Thread.sleep(5000 } catch (InterruptedException e) { e.printStackTrace(). ); } sincronizado(o2){ System.out.println("1"); sincronizado(o2){ tente { Thread.sleep(5000 } catch (InterruptedException e) { e.printStackTrace() } sincronizado(o1){ System.out.println("2");4. Bloquear
public class TT implements Runnable{ /**Lock* @param args */ int b = 100; public static void main(String[] args) { TT tt = new TT(); .start();tente { tt.m2() } catch (Exceção e) { e.printStackTrace(); System.out.println(tt.b } @Override public void run() { try { m1(); catch (Exception e) { e.printStackTrace(); b = 1000; Thread.sleep(5000); System.out.println("b="+b); Exceção{ Thread.sleep(2500);A saída agora é:
1000b=1000
Pode-se ver que m2 é executado primeiro e m1 não pode ser executado até que m2 seja concluído.
Espero que este artigo seja útil para o design de programação Java de todos.