gpt4 book ai didi

java - 线程如何能够访问应该是 block 的同步块(synchronized block)?

转载 作者:行者123 更新时间:2023-12-02 06:42:18 25 4
gpt4 key购买 nike

我编写了下面的Java程序。该程序正在创建三个线程并启动它们:

public class MyThread implements Runnable {

@Override
public synchronized void run() {

int count = 0;
while (true) {

System.out.println("" + Thread.currentThread().getName());

if (count == 20 && Thread.currentThread().getName().equals("Thread-1")) {
try {
Thread.currentThread().sleep(100000000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
count++;
}//while ennds here
}//run ends here
}//class ends here


public class TestThread {

public static void main(String[] args){

Thread t1 = new Thread(new MyThread());
t1.setName("Thread 1");
Thread t2 = new Thread(new MyThread());
t1.setName("Thread 2");
Thread t3 = new Thread(new MyThread());
t1.setName("Thread 3");

t1.start();
t2.start();
t3.start();
}

}

第二个线程在一段时间后进入休眠状态。

由于 run 方法是同步的,因此一次只能由一个线程访问。

Sleep 方法永远不会释放对象上的锁。但这里一旦“线程1”进入休眠状态,之后“线程2”和“线程3”就可以成功访问相同的方法并继续执行。

有人能解释一下这里发生了什么吗?根据 sleep 的概念,“线程1”进入休眠后应暂停执行。

最佳答案

您的synchronized位于实例方法上。仅当您在同一实例上调用该方法时,它才会同步。你没有这样做。您正在 3 个不同的实例上调用 run() 方法。

关于java - 线程如何能够访问应该是 block 的同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030972/

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