2017-01-26 200 views
0

我正在使用這三個類來測試多線程的概念。Java多線程同步塊

該類由線程執行的方法組成。

class MainClass { 

static MainClass mainClass; 

String name = "Sibendu"; 

MainClass() 
{ 
    mainClass = this; 
} 

public static void main(String args[]) 
{ 
    new MainClass(); 
    ThreadImpl thread = new ThreadImpl(mainClass); 
    ThreadImpl2 thread2 = new ThreadImpl2(mainClass); 

    thread.start(); 
    thread2.start(); 
} 

public void printMyName() throws InterruptedException { 
    String name = "Sibendu"; 
    synchronized (name) { 
     System.out.println("Inside printMyName()"); 
     Thread.sleep(4000); 
     System.out.println(name); 
    } 
} 

public void printMyName2() throws InterruptedException { 

    synchronized (name) { 
     System.out.println("Inside printMyName2()"); 
     Thread.sleep(4000); 
     System.out.println(name); 
    } 
} 

} 

兩個線程:

class ThreadImpl extends Thread { 

MainClass mainClass = null; 

ThreadImpl(MainClass mainClass) { 
    this.mainClass = mainClass; 
} 
@Override 
public void run() { 
    try { 
     mainClass.printMyName(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
    } 




public class ThreadImpl2 extends Thread 
{ 

MainClass mainClass = null; 
ThreadImpl2(MainClass mainClass) { 
    this.mainClass = mainClass; 
} 

@Override 
public void run() { 
    try { 
     mainClass.printMyName2(); 
    } catch (InterruptedException e) { 

     e.printStackTrace(); 
    } 
} 

} 

同步塊是在兩個不同的變量。 其中一個是本地的,另一個是MainClass的實例變量。

我的問題是即使在兩種不同類型的變量上執行同步。爲什麼「thread2」處於等待狀態,直到thread1完成操作?

我已驗證輸出。這是輸出:

內printMyName() Sibendu 內printMyName2() Sibendu

回答

3

的原因是您在字符串同步文字,這實際上是同一個變量:"Sibendu" == "Sibendu"

因此,儘管出現,你只使用1鎖。

String.intern() documentation說:

所有文字字符串和字符串值常量表達式拘留。

如果您用name = new String("Sibendu")替換其中的一個,您將會觀察到您期望的行爲。

+0

所以同步發生在字符串文字是「Sibendu」? – Sibendu

+2

每個對象都是java中的鎖。當你使用完全相同的對象時,你可以使用相同的鎖。實際上,相同的_String literals_會產生相同的對象。因此,我認爲使用'String'作爲鎖是一個非常糟糕的主意。 – rom1v

+0

真的......在不知從何處測試「this」上的同步時,想到了嘗試這段代碼 – Sibendu