2017-01-26 154 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