gpt4 book ai didi

java - 两个线程一个同步方法scjp

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

为什么这个字母的答案是b? (下面有问题和答案)我理解 7a 7b 8a 8b,因为该方法是同步的,因此一次只能执行一个线程,但为什么 6a 7a 6b 7b 也可以接受?第二个线程不应该等待第一个线程完成该方法吗?

public class Lockdown implements Runnable {
public static void main(String[] args) {
new Thread(new Lockdown()).start();
new Thread(new Lockdown()).start();
}
public void run() { locked(Thread.currentThread().getId()); }
synchronized void locked(long id) {
System.out.print(id + "a ");
System.out.print(id + "b ");
}
}

b) 组 7a 7b 8a 8b 和组 6a 7a 6b 7b 都是可能的。 (*)

最佳答案

这是正确的,因为有两个 Lockdown 对象,每个对象都有一个线程。例如

Lockdown lockk = new Lockdown();
new Thread(lockk).start(); //thread1
new Thread(lockk).start(); //thread2

会导致线程等待第一个完成执行。所以结果总是7a 7b 8a 8b,或者类似的东西。仅当线程在同一对象上运行时,同步方法才会使线程等待。

但是当线程在不同的对象上运行时,它也可能输出6a 7a 6b 7b。你的例子就像

Lockdown lock1 = new Lockdown();
Lockdown lock2 = new Lockdown();
new Thread(lock1).start(); //thread1
new Thread(lock2).start(); //thread2

输出:

thread1 on lock1 print -> 6a
thread2 on lock2 print -> 7a
thread1 on lock1 print -> 6b
thread2 on lock2 print -> 7b

但也可以是:

thread1 on lock1 print -> 6a
thread1 on lock1 print -> 6b
thread2 on lock2 print -> 7a
thread2 on lock2 print -> 7b

因此您可以获得 2 个不同的结果。

关于java - 两个线程一个同步方法scjp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629342/

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