2013-08-19 2 views
0

하나의 스레드가 한 개체 (이 경우 objsyn)에서 동기화 된 메서드를 호출하면 스레드가 개체와 함께 완료 될 때까지 다른 모든 스레드가 대기해야하므로 5 개의 스레드를 만들려고했습니다. 따라서 출력은 스레드 1에서 스레드 5까지 순서대로 이루어져야합니다. 그러나 출력이 잘못되어 있습니다.동기화 방법

class synctest extends Thread 
    { 
     public synchronized void display() 
     { 
      try{Thread.sleep(5000*((long)(Math.random())));} 
      catch(Exception e){} 

      System.out.println("From synchornized thread "+ Thread.currentThread().getName()); 
     } 
     public synchronized void run() 
     { 
      synctest objsyn = new synctest(); 
      objsyn.display(); 
     } 
     public static void main(String args[]) 
     { 
      synctest objsy = new synctest(); 
      Thread t1 = new Thread(objsy,"Thread 1"); 
      Thread t2 = new Thread(objsy,"Thread 2"); 
      Thread t3 = new Thread(objsy,"Thread 3"); 
      Thread t4 = new Thread(objsy,"Thread 4"); 
      Thread t5 = new Thread(objsy,"Thread 5"); 
      t1.start(); 
      t2.start(); 
      t3.start(); 
      t4.start(); 
      t5.start(); 
     } 
     } 
+0

스레드가 일정하지 않은 시간에 시작됩니다. 'start()'메소드를 호출하는 순서는 그 안에 하나의 요소에 불과하다. 결함이있어 설계를 재고해야합니다. – allprog

답변

5

스레드 실행 순서가 보장되지 않습니다. 동기화는 특정 시점에 해당 코드 블록을 실행하는 스레드를 하나만 확인하고 첫 번째 스레드 (또는 두 번째 스레드)인지 여부는 신경 쓰지 않습니다.

실제로 특정 논리를 순서대로 실행하려면 스레딩이 필요하지 않습니다. 스레드를 시작하면 주 스레드와 별도의 스레드가됩니다. answers for this question이 도움이 될 수 있습니다.

+0

@ Nambari : 그러면 동기화의 전체적인 점은 무엇입니까 –

+0

잠금 대기열 대기열 주문이 없습니다. – SLaks

+1

@roshandhb : 동기화는 하나의 스레드가 해당 특정 논리를 벗어나지 않도록합니다. – kosa