【问题标题】:Java multi-threading Synchronized BlockJava多线程同步块
【发布时间】:2017-01-26 10:44:15
【问题描述】:

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

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

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() 西本杜 内部 printMyName2() 西本都

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

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

    因此,尽管看起来,您只使用了 1 把锁。

    String.intern() documentation 说:

    所有文字字符串和字符串值的常量表达式都被保留。

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

    【讨论】:

    • 所以同步发生在字符串字面量“Sibendu”上?
    • 每个对象都是java中的一个锁。当你使用同一个对象时,你使用的是同一个锁。实际上,相同的 String literals 产生完全相同的对象。因此,我认为将Strings 用作锁是一个非常糟糕的主意。
    • True...突然在“this”上测试同步,想到试试这段代码
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多