我正在使用这三个类来测试多线程的概念。
该类由线程执行的方法组成。
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
答案 0 :(得分:3)
原因是你在String literals 上进行同步,它们实际上是同一个变量:"Sibendu" == "Sibendu"
。
因此,尽管有外观,但您只使用1次锁定。
String.intern() documentation说:
所有文字字符串和字符串值常量表达式都是实现的。
如果您按name = new String("Sibendu")
替换其中一个,则会观察到您预期的行为。