gpt4 book ai didi

Java多线程同步块(synchronized block)

转载 作者:行者123 更新时间:2023-12-01 21:08:24 24 4
gpt4 key购买 nike

我正在使用这三个类测试多线程的概念。

此类由线程执行的方法组成。

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();
}
}

}

同步块(synchronized block)位于两个不同的变量上。其中一个是本地变量,另一个是 MainClass 的实例变量。

我的问题是,即使同步是在两种不同类型的变量上执行的。为什么“thread2”处于等待状态,直到thread1完成操作?

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

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

最佳答案

原因是您在字符串文字上进行同步,它们实际上是同一个变量:"Sibendu"== "Sibendu"

因此,不管表面如何,您只使用一把锁。

String.intern() documentation说:

All literal strings and string-valued constant expressions are interned.

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

关于Java多线程同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com