gpt4 book ai didi

java - 线程如何工作

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:12 24 4
gpt4 key购买 nike

我无法理解线程的工作原理:

class ThreadTest implements Runnable{ 
synchronized void methodA(long n){
for (int i=1;i<3;i++){System.out.print(n+" "+i)}
}

public void run(){
methodA(Thread.currentThread.getId());
}

public static void main(String ... args){
new Thread(new ThreadTest()).start();
new Thread(new ThreadTest()).start();
}
}

据我目前的理解,因为 methodA 在这个方法中是一个同步的 for 循环,它必须在下一个线程调用这个方法之前完成——所以结果必须像 4-1 4 -2 5-1 5-2...

是否有可能得到像 4-1 5-1 5-2 4-2 这样的结果?如果是,如何?

最佳答案

Is it possible to have result like 4-1 5-1 5-2 4-2.?

这是可能的。

If yes how?

您正在使用 this 引用作为被 synchronized 锁定的对象。由于您有两个不同的 ThreadTest 实例,因此每个方法都锁定其自己的实例并且没有实现互斥。

因此,您必须了解synchronized 的语义:总是有一个明确定义的对象涉及其monitor acquired。基本上,该对象记录了哪个线程已经获得了它的监视器,并且只允许同一个线程重新获得它;其他线程将被搁置,直到监视器被释放。任何其他对象自然与此无关,它的监视器可以由任何线程自由获取。

synchronized 方法隐式使用 this 作为锁。您可以为您的示例做的是声明一个 static final Object lock = new Object(); 并在您的方法中使用 synchronized(lock)

关于java - 线程如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627610/

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