我正在使用这三个类测试多线程的概念。
此类由线程执行的方法组成。
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()西本杜
原因是您在String文字上进行了同步,而这些文字实际上是相同的变量:"Sibendu" == "Sibendu"
。
因此,尽管有出现,您只能使用1个锁。
所有文字字符串和字符串值常量表达式都将被插入。
如果将其中之一替换为name = new String("Sibendu")
,则会观察到预期的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句