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