2017-05-09 4 views
0

다른 스레드를 시작하여 클래스를 모두 실행하려고하면 동기화 된 메서드가 세 개 있습니다. 동기화 된 출력을 볼 수 없으며 개체에 대한 잠금이 없습니다. & 출력에서 ​​모두 볼 수 있습니다. 스레드가 동시에 실행됩니다. 아래는 제 코드입니다. 입력은 감사하겠습니다. 감사합니다멀티 스레드에서 동기화

공용 클래스 DisplayMessage {

public static synchronized void sayHello(String name) throws InterruptedException{ 
    for(int i=1; i<=10;i++){ 
     Thread.sleep(1000); 
     System.out.println("How are you"+name); 
    } 
} 
public synchronized void sayHello1(String name2,int j){ 
    for(int i=1; i<=10;i++){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("How are you Hello1 :: "+name2+ " Age " + j); 
    } 
} 
public synchronized void sayHello2(String name3,String lastname){ 
    for(int i=1; i<=10;i++){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("How are you Hello 2 :: "+ name3 + " lastname " +lastname); 
    } 
} 

} Thread 클래스 : 공용 클래스 MyThread2이 확장 스레드 {:

공용 클래스 MyThread는 스레드 {

String name; 


MyThread(String name) { 

    this.name = name; 
} 

public void run() { 

    try { 
     DisplayMessage.sayHello(name); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

} Thread2 클래스 확장

String name2; 
String name3; 

int age; 
DisplayMessage dm; 

MyThread2(DisplayMessage dm, String name2, int age) { 
    this.dm = dm; 
    this.name2 = name2; 
    this.age = age; 
} 

public void run() { 

    dm.sayHello1(name2, age); 

} 

} Thread3 클래스 :

패키지 동기화.계급;

MyThread3 주요 방법은 다른 스레드에게 공용 클래스 SynchronizationDemo {

public static void main(String[] args) { 
    DisplayMessage dm=new DisplayMessage(); 
    MyThread t1= new MyThread("steve"); 
    MyThread t2=new MyThread("Anitha"); 
    MyThread2 t3=new MyThread2(dm," Amit", 31); 
    MyThread3 t4=new MyThread3(dm," Arit ","urkude"); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    t4.start(); 

} 

} 아래

산란 사용한 나사 {

String name3; 
String lastname; 
int age; 

DisplayMessage dm2; 

MyThread3(DisplayMessage dm, String name3, String lastname) { 
    this.dm2 = dm; 
    this.name3 = name3; 
    this.lastname = lastname; 
} 

public void run() { 

    dm2.sayHello2(name3, lastname); 
} 

}

Democlass 연장

공용 클래스 출력은 :

yousteve 얼마나 당신에게 얼마나 Hello1 :: 나이 31 어떻게에게 있습니다 Hello1 :: 미트 나이는 31 는 yousteve 얼마나 yousteve 얼마나 당신에게 얼마나 Hello1 :: 나이 31 어떻게 yousteve 미트 미트 있습니다 어떻게 당신에게 Hello1 :: 미트 나이 31 yousteve 얼마나 당신에게 얼마나 Hello1 :: 미트 나이 31 yousteve 얼마나 당신에게 얼마나 Hello1 :: 미트 나이 31 yousteve 얼마나 당신에게 얼마나 Hello1 :: 미트 시대입니다 31 안녕하세요? :: Amit Age 31 어떻게 지내세요? yousteve 얼마나 어떻게 Hello1 :: 미트 나이가 31 이 yousteve 얼마나 당신에게 얼마나 Hello1 :: 어떻게 안녕하세요입니다 미트 youAnitha 얼마나 나이 31 2 : Arit LASTNAME urkude 어떻게 얼마나 youAnitha 당신에게 있습니다 여러분 안녕하세요 2 : Arit LASTNAME urkude youAni 얼마나 안녕하세요을 얼마나 2 : Arit LASTNAME urkude youAni 얼마나 2 : Arit LASTNAME urkude 안녕하세요을하는 방법 2 : Arit LASTNAME urkude 안녕하세요을 얼마나 How are youAni 안녕하세요안녕하세요 2 :: Arit 성 urkude 어떻게 youAni 있습니다 안녕하세요을 얼마나 2 : Arit LASTNAME urkude 안녕하세요을 얼마나 2 : Arit LASTNAME youAni 얼마나 urkude youAni 얼마나 안녕하세요을 얼마나 2 : Arit LASTNAME 방법이다 youAni 얼마나 urkude you Hello 2 :: Arit 성 urkude

+0

정적 메서드뿐만 아니라 2 개의 인스턴스 메서드를 synchornizing하는 것은 원하는 것입니까?. 왜 하나의 방법을 사용하여 동기화 된 작업을 볼 수 없는지 – TheLostMind

답변

2

보고있는 출력은 코드에 따라 완벽하게 유효합니다. MyThread은 메서드를 사용하며 static이므로 DisplayMessage.class 개체에서 동기화됩니다. sayHello1sayHello2, this에 동기화 - 비 정적 메소드를 호출하는

public static void sayHello(String name) throws InterruptedException{ 
    synchronized(DisplayMessage.class) { 
     for(int i=1; i<=10;i++){ 
      Thread.sleep(1000); 
      System.out.println("How are you"+name); 
     } 
    } 
} 
반면 다른 두 개의 스레드에

, MyThread2MyThread3 : static 방법에 synchronized 키워드의 사용법은 동일합니다.

public void sayHello1(String name2,int j){ 
    synchronized(DisplayMessage.this) { 
     for(int i=1; i<=10;i++){ 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("How are you Hello1 :: "+name2+ " Age " + j); 
     } 
    } 
} 

그래서, 당신의 출력이 steveAmit이 concurently AnithaArit 코드는 두 개의 서로 다른 개체에 대한 동기화로 예상되는, concurently 실행하여 다음 실행 포함에이 경우 synchronized 키워드의 사용법은 동일합니다.

+0

설명해 주셔서 감사합니다. – GoodToLearn

+0

내 대답에 대해 투표를하고 문제가 해결되면 승인 된 것으로 표시해주십시오. – Piotrek

1

static 키워드에 추가 된 동기화 된 키워드는 클래스 잠금에 해당하는 현재 * .java 파일입니다. no-static 메소드에 추가 된 synchronized 키워드는이 오브젝트 잠금에 대한 것입니다. 두 개의 잠금은 다르지만이 오브젝트 잠금과 ​​클래스 잠금은 서로 다시 입력 할 수 있습니다.