>  기사  >  Java  >  Java의 동기화 기능 공유 예

Java의 동기화 기능 공유 예

黄舟
黄舟원래의
2017-09-19 10:09:101259검색

이 글은 주로 Java의 동기화 기능에 대한 자세한 설명에 대한 정보를 소개합니다. 동기화 기능이 필요한 친구들은 이 글을 참고해 보세요.

동기화에 대한 자세한 설명 function in Java

Java에서 클래스의 멤버 함수를 동기화로 수정하면 이는 동일한 객체에 해당합니다. 여러 스레드가 이 객체의 동기화 함수를 호출하면 이전 스레드가 호출을 완료할 때까지 기다려야 합니다. 다음 스레드에서 호출할 수 있습니다.

그렇다면 코드에 표시된 것처럼 동기화로 수정되는 두 개의 멤버 함수가 클래스에 있는 경우 동일한 객체에 대해 두 스레드가 실행 중일 때 하나는 funcA를 호출하고 다른 하나는 funcB를 호출할 수 있습니까?

Mysyn이 그런 클래스입니다. 두 개의 스레드가 있으면 하나는 먼저 funcA를 실행한 다음 run 메서드에서 funcB를 실행하고, 다른 스레드는 먼저 funcB를 실행한 다음 run 메서드에서 funcA를 실행합니다. start A...를 출력할 때 start B...를 직접 출력하는 것이 가능한가요?


public class MySyn { 
  public synchronized void funcA(String str){ 
    System.out.println(str+":"); 
    System.out.println("start A..."); 
    try { 
      Thread.sleep(5000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    System.out.println("...A end"); 
  } 
   
  public synchronized void funcB(String str){ 
    System.out.println(str+":"); 
    System.out.println("start B..."); 
    try { 
      Thread.sleep(5000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    System.out.println("...B end"); 
  } 
}

테스트 코드는 다음과 같습니다.

이 스레드는 funcA를 먼저 실행합니다


public class Mythread implements Runnable { 
 
  private MySyn mysyn; 
  private String id; 
  public Mythread(MySyn syn, String id){ 
    this.mysyn = syn; 
    this.id = id; 
  } 
  @Override 
  public void run() { 
     
    this.mysyn.funcA(id); 
    try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    this.mysyn.funcB(id); 
  } 
   
  public static void main(String arg[]){ 
    MySyn syn=new MySyn(); 
    Thread t1 = new Thread(new Mythread(syn, "t1")); 
    Thread t2 = new Thread(new YourThread(syn, "t2")); 
     
     
    t1.start(); 
    t2.start(); 
  } 
}

이 스레드는 funcB를 먼저 실행합니다


public class YourThread implements Runnable { 
 
  private MySyn mysyn; 
  private String id; 
  public YourThread(MySyn syn, String id){ 
    this.mysyn = syn; 
    this.id=id; 
  } 
  @Override 
  public void run() { 
    this.mysyn.funcB(id); 
    this.mysyn.funcA(id); 
     
 
  } 
 
}

출력 결과는 대부분 다음과 같습니다. 으아아아아

if Mythread의 run 메소드에서 두 함수 호출 사이의 절전 모드를 취소합니다. 결과는 다음과 같습니다.


t1: 
start A... 
...A end 
t2: 
start B... 
...B end 
t2: 
start A... 
...A end 
t1: 
start B... 
...B end

개별 결과는 스레드 스케줄링으로 인해 다를 수 있지만 절대 그렇지 않습니다. start A... 따랐습니다. B를 직접 시작합니다. ..


그럼 funcB가 동기 함수가 아닌 경우 위 코드를 실행하면 어떤 결과가 나올까요?

funcB의 동기화 키워드를 제거하기 위해 코드가 약간 수정되었습니다. 실행 결과는 다음과 같습니다.

t1: 
start A... 
...A end 
t1: 
start B... 
...B end 
t2: 
start B... 
...B end 
t2: 
start A... 
...A end

분명히 시작 A...의 결과는 시작 B... 이후에 직접 출력됩니다....


마찬가지로 Mysyn 클래스에 공용 멤버 변수가 있는 경우 멀티 스레드는 동기화 함수가 호출되는 동안 다른 스레드에 의해 멤버 변수를 수정할 수도 있습니다.

위의 실험은 다음을 보여줍니다. 동기화된 멤버 함수는 동일한 개체의 동기화된 함수 호출에서 다른 동기화된 함수(자신 포함)에만 독점적인 영향을 미칠 수 있습니다. 즉, 다중 스레드 작업에서 동일한 개체는 현재만 가능합니다. have one 동기화된 기능이 실행 중이지만, 동기화되지 않은 다른 기능의 실행이나 멤버에 대한 접근을 배제하지는 않습니다.

이제 클래스에 두 개의 정적 동기화 메서드가 있다고 가정해 보겠습니다. 상황은 어떻습니까?

결과가 유사하므로 특정 구현을 반복하지 않겠습니다.

멀티 스레딩에서 동일한 클래스는 현재 하나의 클래스 동기화 기능(정적 동기화 기능)만 실행할 수 있지만 다른 비동기화 정적 기능은 제외되지 않았습니다. 정적 멤버를 실행하거나 액세스하세요

위 내용은 Java의 동기화 기능 공유 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.