0
我正在使用这三个类来测试多线程的概念。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的实例变量。
我的问题是即使在两种不同类型的变量上执行同步。为什么“thread2”处于等待状态,直到thread1完成操作?
我已验证输出。这是输出:
内printMyName() Sibendu 内printMyName2() Sibendu
所以同步发生在字符串文字是“Sibendu”? – Sibendu
每个对象都是java中的锁。当你使用完全相同的对象时,你可以使用相同的锁。实际上,相同的_String literals_会产生相同的对象。因此,我认为使用'String'作为锁是一个非常糟糕的主意。 – rom1v
真的......在不知从何处测试“this”上的同步时,想到了尝试这段代码 – Sibendu