Java多线程同步块

时间:2017-01-26 10:44:15

标签: java multithreading

我正在使用这三个类来测试多线程的概念。

该类由线程执行的方法组成。

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

1 个答案:

答案 0 :(得分:3)

原因是你在String literals 上进行同步,它们实际上是同一个变量:"Sibendu" == "Sibendu"

因此,尽管有外观,但您只使用1次锁定。

String.intern() documentation说:

  

所有文字字符串和字符串值常量表达式都是实现的。

如果您按name = new String("Sibendu")替换其中一个,则会观察到您预期的行为。