java 다중 스레드 - 동기화 블록 실례 설명

java 다중 스레드 - 동기화 블록
Java 동기화 블록(synchronized block)은 표기법이나 코드 블록이 동기화되는 데 사용됩니다.Java 동기화 블록은 경쟁을 방지하는 데 사용됩니다.이 문서에서는 다음을 설명합니다.
  • 자바 동기화 키워드(synchronzied)
  • 실례 방법과 동기화
  • 정적 방법의 동기화
  • 실례 방법에서 블록을 동기화합니다
  • 정적 방법 중 동기화 블록
  • Java 동기화 예
  • Java 동기화 키워드(synchronized)
    Java의 동기화 블록은 synchronized로 표시됩니다.동기화 블록은 Java에서 객체에 동기화됩니다.하나의 대상에 동기화된 모든 동기화 블록은 한 라인에만 들어가서 작업을 수행할 수 있습니다.동기화 블록에 들어가기를 기다리는 다른 모든 라인은 이 동기화 블록의 라인이 끝날 때까지 막힙니다.
    네 가지 다른 동기화 블록이 있습니다.
  • 실례적인 방법
  • 정적 방법
  • 실례 방법의 동기화 블록
  • 정적 방법 중의 동기화 블록

  • 위의 동기화 블록은 서로 다른 객체에 동기화됩니다.실제로 그런 동기화 블록은 구체적인 상황에 따라 정해져야 한다.
    인스턴스 방법 동기화
    다음은 동기화 인스턴스 방법입니다.
    
     public synchronized void add(int value){
    this.count += value;
     }
    정적 방법 동기화
    정적 방법 동기화는 실례 방법 동기화 방법과 마찬가지로synchronized 키워드를 사용합니다.Java 정적 방법의 동기화는 다음과 같습니다.
    
    public static synchronized void add(int value){
     count += value;
     }
    
    마찬가지로, 여기synchronized 키워드는 자바에게 이 방법이 동기화된다는 것을 알려준다.
    정적 방법의 동기화는 이 방법이 있는 클래스 대상에 동기화하는 것을 가리킨다.Java 가상 시스템에서 하나의 클래스는 하나의 클래스 대상에만 대응하기 때문에 한 라인만 같은 클래스의 정적 동기화 방법을 실행할 수 있습니다.
    다른 종류의 정적 동기화 방법에 대해 하나의 라인은 모든 종류의 정적 동기화 방법을 실행할 수 있으며 기다릴 필요가 없다.클래스 중의 그 정적 동기화 방법이 호출되든지 간에, 하나의 클래스는 하나의 라인에서만 동시에 실행될 수 있다.
    인스턴스 방법의 동기화 블록
    때때로 너는 전체 방법을 동기화할 필요가 없고, 동기화 방법 중의 일부분이다.Java는 메서드의 일부를 동기화할 수 있습니다.
    비동기식 Java 메서드에서 블록 동기화의 예는 다음과 같습니다.
    
    public void add(int value){
    
     synchronized(this){
      this.count += value;
     }
     }
    
    
    예제에서는 Java 동기화 블록 구조기를 사용하여 블록 코드가 동기화됨을 표시합니다.이 코드는 실행할 때 동기화 방법과 같다.
    Java 동기식 블록 구조기는 괄호로 객체를 둘러쌉니다.상례에서 "this", 즉add 방법을 호출하기 위한 실례 자체를 사용했습니다.동기화 구조기에서 괄호로 묶은 대상을 모니터 대상이라고 한다.상기 코드는 모니터 대상을 동기화하고 동기화 실례 방법은 호출 방법 자체의 실례를 모니터 대상으로 한다.
    한 번에 하나의 스레드만 동일한 모니터 객체에 동기화되는 Java 메서드에서 실행할 수 있습니다.
    다음 두 가지 예는 모두 그들이 호출한 실례 대상을 동기화하기 때문에 동기화의 실행 효과는 등효이다.
    
     public class MyClass {
    
     public synchronized 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);
      }
     }
     }
    
    
    상례에서, 매번 하나의 라인만 두 개의 동기화 블록 중 임의의 방법에서 실행할 수 있다.
    만약 두 번째 동기화 블록이this 실례 대상에 동기화되지 않는다면, 두 가지 방법은 라인에서 동시에 실행될 수 있다.
    정적 방법의 동기화 블록
    위와 유사하지만 다음은 두 가지 정적 방법이 동기화된 예이다.이 방법은 이 방법이 속한 클래스 대상에 동기화됩니다.
    
    public class MyClass {
     public static synchronized 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);
      }
     }
     }
    
    
    이 두 가지 방법은 동시에 라인에 접근하는 것을 허락하지 않는다.
    두 번째 동기화 블록이 MyClass에서 동기화되지 않은 경우class라는 대상에그러면 이 두 가지 방법은 동시에 라인에 접근할 수 있다.
    Java 동기화 인스턴스
    다음 예에서 두 개의 라인을 시작했습니다. 모두Counter와 같은 실례의add 방법을 사용합니다.이 방법이 속한 실례에 동기화되기 때문에 이 방법에 접근할 수 있는 라인은 하나밖에 없습니다.
    
    public class Counter{
      long count = 0;
    
      public synchronized void add(long value){
      this.count += value;
      }
     }
     public class CounterThread extends Thread{
    
      protected Counter counter = null;
    
      public CounterThread(Counter counter){
      this.counter = counter;
      }
    
      public void run() {
     for(int i=0; i<10; i++){
       counter.add(i);
      }
      }
     }
     public class Example {
    
     public static void main(String[] args){
      Counter counter = new Counter();
      Thread threadA = new CounterThread(counter);
      Thread threadB = new CounterThread(counter);
    
      threadA.start();
      threadB.start();
     }
     }
    
    
    두 개의 라인을 만들었습니다.그들의 구조기는 같은 카운터 실례를 인용한다.Counter.add 방법은 실례에 동기화되었습니다.add 방법은 실례 방법이고synchronized 키워드가 표시되어 있기 때문입니다.따라서 매번 한 라인만 이 방법을 호출할 수 있다.다른 라인은 첫 번째 라인이add () 방법을 종료할 때까지 기다려야 방법을 계속 실행할 수 있습니다.
    만약 두 라인이 두 개의 다른Counter 실례를 인용한다면, 그들은 동시에add () 방법을 호출할 수 있다.이 방법들은 서로 다른 대상을 호출하기 때문에 이 방법들도 서로 다른 대상에 동기화된다.이 방법들의 호출은 막히지 않을 것이다.아래의 예에서 보듯이
    
    public class Example {
    
     public static void main(String[] args){
      Counter counterA = new Counter();
      Counter counterB = new Counter();
      Thread threadA = new CounterThread(counterA);
      Thread threadB = new CounterThread(counterB);
    
      threadA.start();
      threadB.start();
     }
     }
    
    
    이 두 라인,threadA와threadB를 주의하십시오. 더 이상 같은counter 실례를 인용하지 않습니다.CounterA와 counterB의 add 방법은 그들이 속한 대상에 동기화됩니다.counterA를 호출하는add 방법은counterB를 호출하는add 방법을 막지 않습니다.
    이상은 자바 다중 스레드 동기화 블록에 대한 지식 설명입니다. 다음에 관련 자료를 계속 보충해 주십시오. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기