Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两线程一同步方法scjp_Java_Multithreading_Thread Safety_Scjp - Fatal编程技术网

Java 两线程一同步方法scjp

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

为什么这封信的答案是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 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考试的