Java 两线程一同步方法scjp
为什么这封信的答案是b?(以下问答) 我理解7a 7b 8a 8b,因为该方法是同步的,因此一次只能执行一个线程,但为什么6a 7a 6b 7b也可以接受呢?第二个线程不应该等待第一个线程使用该方法完成吗Java 两线程一同步方法scjp,java,multithreading,thread-safety,scjp,Java,Multithreading,Thread Safety,Scjp,为什么这封信的答案是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();
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 lockk = new Lockdown();
new Thread(lockk).start(); //thread1
new Thread(lockk).start(); //thread2
将导致线程等待第一个线程完成执行。所以结果总是7a7b8a8b
,或者类似的东西。同步方法仅当线程在同一对象上运行时才使线程等待
但是当线程在不同的对象上运行时,它也可以输出6a7a6b7b
。你的例子是
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
因此,您可以得到两种不同的结果。打印或记录不是同步的一部分。请完整阅读本节:
这类似于问题:
您是否尝试运行代码
我做到了,我也得到了同样的结果
9a 9b 10a 10b
第二次
9a 10a 10b 9b
这意味着线程可以任意获取和释放锁。在执行序列真正发生之前,您无法预测它
请注意,synchronized关键字保证一次只有一个线程访问代码块。如果这个问题来自internet,它可能有错误的“正确”答案…@John这是来自SCJP考试的