2016-06-11 2 views
-1

동기화 블록은 내가 자바 동기화 블록을 얻을 수 없습니다입니다

내가이 다음 게시물을 읽을 수는 있지만 매우 SYN-블록과 잠금

Synchronized block not working

에 대해 못해서 아주 잘 작동하지 않는 내가 A의, B의, C의 그것을 동기화 후에도 균일하게 배열하여 출력되지 않은 이유 코드 아래 몰라 .. C의

public class synchronizeblock 
{ 
    static StringBuffer s=new StringBuffer(); 
    public static void main(String []args) 
    { 
     Threading t1=new Threading(s,'a'); 
     Threading t2=new Threading(s,'b'); 
     Threading t3=new Threading(s,'c'); 
     t1.start(); 
     t2.start(); 
     t3.start();  
    } 
} 
class Threading extends Thread 
{ 
    StringBuffer sb; 
    char ch; 

    Threading() 
    { 

    } 
    Threading(StringBuffer sb,char ch) 
    { 
     this.sb=sb; 
     this.ch=ch; 
    } 
    public void run() 
    { 
     synchronized(this) // this(current instance) acts as lock ?? 
     { 
       for(int i=0;i<20;++i) 
       { 
        System.out.print(ch); 
       } 
     }  
    } 

} 

한 출력의 ASE에은 다음과 같습니다 :

bbbbbbbbbbbbbaccccccccccccccccccccaaaaaaaaaaaaaaaaaaabbbbbbb

내 관심사는 스레드가 시작되면, 스레드가 문자 'B'로해야하지 (이 "하나"스레드 - 일) 말하는 것입니다 다른 스레드가 스레드 "하나"개체에 잠금을 가지고 있기 때문에, 실행 잘못 오전 경우에 저를 정정 할 기회를 얻고 난 다음 질문

  1. 정말 "W"고정됩니다 무엇 "과 혼란을하기 전에 완료 모자는 자물쇠 역할을합니다. " 그래서 정확히 내 코드

  2. 와 내가 균일 한 출력을 얻기 위해 무엇을해야에 잠겨있어 무엇인지 설명

(여기 균일 한 출력을 말해서, 난 스레드가 시작하면 그 문자가 20 번 인쇄되는 것을 의미)
+1

'synchronized'는 주어진 객체에 잠금을 걸고,'this'는이 경우입니다. 당신은 3 개의 Threading 인스턴스를 가지므로 3 개의 다른 객체를 잠그고, 그 밖의 객체를 잠그려고하지 않으므로 잠금은 아무런 효과가 없습니다. – Andreas

+0

"물체에 고정되어있어"라고 말하면 어떤 물체입니까? –

+0

@Andreas는 동기화 (aaaa)를 고려하여 aaaa가 자물쇠처럼 작동하지 않고 오히려 잠금 상태가되면 잘못했는지 확인합니다. – viru

답변

2

문자열 버퍼가 여러 스레드로 안전하게 사용할 수 있습니다. 메서드는 필요에 따라 동기화되어 모든 특정 작업의 모든 작업 은 해당 스레드가 포함 된 각각의 에 의해 수행 된 메서드 호출 순서와 일치하는 일부 serial 순서로 발생하는 것처럼 동작합니다.

하고 Thread도 실행 s의 것을 현재의 thread가에 대한 완료되지 의 경우이 A's B's C's처럼 내 출력하지에 대한 질문의 하단하지만 문제에서 읽을 수 있습니다 나머지는 join() 방법의 TELL의를 사용할 수 있습니다 그 마무리는 다음 일을 가서 내 일 때까지 다른 스레드 대기 때문에, 당신의 main 방법은 정말 conf의의이

 Threading t1 = new Threading(s,'a'); 
     Threading t2 = new Threading(s,'b'); 
     Threading t3 = new Threading(s,'c'); 
     t1.start(); 
     t1.join(); 
     t2.start(); 
     t2.join(); 
     t3.start(); 
0

동기화를 위해 sb을 사용하십시오. 그렇지 않으면 다른 스레드와 동기화되지 않기 때문에 (객체 자체를 잠그고 있기 때문입니다). 또는 세 가지 다른 객체를 동기화하는 데 사용되는 잠금 객체를 만듭니다.

public class Threading extends Thread 
{ 
    private Object synchronizationContext; 
    private StringBuffer sb; 
    private char ch; 

    Threading(StringBuffer sb,char ch, Object synchronizationContext) 
    { 
     this.sb=sb; 
     this.ch=ch; 
    } 
    public void run() 
    { 
     synchronized(synchronizationContext) 
     { 
      for(int i=0;i<20;++i) 
      { 
       System.out.print(ch); 
      } 
     }  
    } 
} 

main 모두에 대해 동일한 synchronizationContext를 사용합니다. 모든 StringBuffer의 첫

public static void main(String []args) 
{ 
    Object synchronizationContext = new Object(); 
    Threading t1 = new Threading(s,'a', synchronizationContext); 
    Threading t2 = new Threading(s,'b', synchronizationContext); 
    Threading t3 = new Threading(s,'c', synchronizationContext); 
    t1.start(); 
    t2.start(); 
    t3.start();  
} 
0
  1. 처럼 "잠긴 것"과 "잠겨있는 역할"을 사용하여

당신이 무엇을 요구하고 있는지 확실하지 않습니다. synchronized (obj)을 수행하면 obj이 잠겨 있습니다. 스레드는 다른 스레드가 이미 잠금을 보유하고있는 경우 차단할 수있는 잠금을 수행합니다. obj이 "잠금 역할을합니다"라고 말하는 것은 적절하지 않습니다.

synchronized(this) // this(current instance) acts as lock ?? 

당신은 문제가 this을에 고정되어, 아래를 참조하십시오.

2.and 내가 귀하의 경우에는 여기에 균일 한 출력

을 말하여 (균일 한 출력을 얻기 위해 무엇을해야합니까, 문제는 그 동기는 this에 있습니다. 각각의 쓰레드가 에 고정되어 .

final Object lock = new Object(); 
Threading t1 = new Threading(lock,'a'); 
Threading t2 = new Threading(lock, b'); 
Threading t3 = new Threading(lock,'c'); 
... 
class Threading extends Thread { 
    final Object lock; 
    final char ch; 
    public Threading(Object lock, char ch) { 
     this.lock = lock; 
     this.ch = ch; 
    } 
    public void run() { 
     // lock on a common lock object in all 3 threads 
     synchronized (lock) { 
      for(int i = 0; i < 20; i++) { 
       System.out.print(ch); 
      } 
     } 
    } 
} 
:
다른 개체를 원한다면 그들의 문자를 인쇄에 단독으로 액세스 할 수있는 뮤텍스 잠금을 가지고, 당신은 그들이 모두에 고정하는 일반적인 객체를 전달해야합니다