JAVA 스레드 동기화 인스턴스 자습서

5085 단어 JAVA라인동기화
루틴은 자바 프로그램 설계에서 매우 중요한 개념으로 본고는 실례 형식으로 이에 대해 상세하게 해석하고자 한다.구체적인 분석은 다음과 같다.
우선, 라인을 잠그면 무슨 소용이 있습니까?예를 들어 당신은 지금 3만 위안의 대양이 은행에 예금되어 있습니다. 지금 당신은 은행에 가서 돈을 찾으세요. 비밀번호를 입력한 후에 이미 인출 금액을 입력했습니다. 예를 들어 당신이 입력한 것은 20000입니다. 바로 은행이 당신에게 돈을 가져다 줄 때 당신의 마누라도 은행에 가서 이 돈을 찾으면 당신의 마누라도 똑같이 20000을 찾습니다. 왜냐하면 이때 당신의 장부는 여전히 30000이기 때문에 은행과 같은 조작은 당신의 마누라에게 다시 한 번 진행되었습니다.이렇게 하면 너희 둘이 각자의 조작을 끝낸 후에 은행이 기록한 너의 장부에 만 위안의 예금이 있어야 한다. 이렇게 하면 매우 시원하지 않겠니?이 문제를 해결하는 데는 라인과 자물쇠를 넣는 지식이 쓰였으니 다음은 우리 함께 공부합시다.
1. 미처리 스레드 동기화의 예:

public class TextSync implements Runnable{
  /** 
   * @param args
   */
  Time time = new Time();
  public static void main(String[] args) {
    TextSync text = new TextSync();
    Thread t1 = new Thread(text);
    Thread t2 = new Thread(text);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }
  @Override
  public void run() {
    time.add(Thread.currentThread().getName());
  }
}
class Time {
  private static int num = 0;
  public void add(String name){
    try {
      num++;
      // ,num 1, ,
      // , ,num 2, ,
      // num 2, 2;
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(name+" "+num+" 。");
  }
}

출력 결과:

t2 2 。
t1 2 。

2. 스레드 동기화

public class TextSynctwo implements Runnable{
  /** 
   * @param args
   */
  Time1 time = new Time1();
  public static void main(String[] args) {
    TextSynctwo text = new TextSynctwo();
    Thread t1 = new Thread(text);
    Thread t2 = new Thread(text);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }
  @Override
  public void run() {
    time.add(Thread.currentThread().getName());
  }
}
class Time1 {
  private static int num = 0;
  
  //synchronized , , 。
  public synchronized void add(String name){
    //synchronized (this) {// , 
      try {
        num++;
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(name+" "+num+" 。");
    //}
  }
}

출력 결과:

t1 1 。
t2 2 。

3. 자물쇠

public class TestDeadLock implements Runnable{
  /** 
   * @param args
   */
  private int flag = 0 ; 
  static Object o1 = new Object();
  static Object o2 = new Object();
  public static void main(String[] args) {
    TestDeadLock td1 = new TestDeadLock(); 
    TestDeadLock td2 = new TestDeadLock(); 
    td1.flag = 1;
    td2.flag = 2;
    Thread t1 = new Thread(td1); 
    Thread t2 = new Thread(td2);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }

  @Override
  public void run() {
    System.out.println(Thread.currentThread().getName());
    if(flag == 1){
      synchronized(o1){
        try {
          Thread.sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        synchronized(o2){
          System.out.println("1");
        }
      }
    }
    if(flag == 2){
      synchronized(o2){
        try {
          Thread.sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        synchronized(o1){
          System.out.println("2");
        }
      }
    }
  }
}

4. 잠금

public class TT implements Runnable{
  /** 
   * @param args
   */
  int b = 100;
  public static void main(String[] args) {
    TT tt = new TT();
    Thread th = new Thread(tt);
    th.start();
    try {
      tt.m2();
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println(tt.b);
  }
  @Override
  public void run() {
    try {
      m1();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private synchronized void m1() throws Exception{
    b = 1000;
    Thread.sleep(5000);
    System.out.println("b="+b);
  }
  private synchronized void m2() throws Exception{
    Thread.sleep(2500);
    b = 2500;
  } 
}
현재 출력 결과는 다음과 같습니다.

1000
b=1000

여기에서 m2가 먼저 실행되고 m1은 m2가 실행이 끝난 후에야 실행할 수 있음을 알 수 있다.
본 논문이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기