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的实例变量。

我的问题是即使对两种不同类型的变量执行同步。为什么在线程1完成操作之前将“线程2”置于等待状态?

我已经验证了输出。这是输出:

内部printMyName()西本杜内部printMyName2()西本杜

rom1v

原因是您在String文字上进行了同步,而这些文字实际上是相同的变量:"Sibendu" == "Sibendu"

因此,尽管有出现,您只能使用1个锁。

String.intern()文档说:

所有文字字符串和字符串值常量表达式都将被插入。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章