gpt4 book ai didi

java - 关于相同/不同对象上的 java 线程的混淆

转载 作者:行者123 更新时间:2023-12-02 05:31:51 26 4
gpt4 key购买 nike

public class Computation extends Thread {

private int num;
private boolean isComplete;

public Computation(int nu) {
num = nu;
}

public void run() {
System.out.println("Thread Called is: " + Thread.currentThread().getName());
}

public static void main(String... args) {
Computation [] c = new Computation[4];
for (int i = 0; i < 3; i++) {
c[i] = new Computation(i);
c[i].start();
}
}
}

我的问题是在主函数中,每次启动线程时我们都会创建一个新的计算对象,那么为什么我们需要 snhrnoized run 方法?我们知道,对于每个不同的类对象,“this”引用都是不同的,因此我们不需要同步。

另外一个例子:

public class DiffObjSynchronized implements Runnable {

@Override
public void run() {
move(Thread.currentThread().getId());
}

public synchronized void move(long id) {
System.out.print(id + " ");
System.out.print(id + " ");
}

public static void main(String []args) {
DiffObjSynchronized a = new DiffObjSynchronized();
/**** output ****/
// 8 9 8 9
new Thread(a).start();
new Thread(new DiffObjSynchronized()).start();
}
}

这是第二个例子,就像我们在两个不同的类实例上创建一个线程一样。这里我们同步 move() 方法,但根据定义:“两个不同的对象可以同时进入synchronized方法”

请分享您的反馈?

最佳答案

如果我理解正确的话,你的问题是:“为什么 move 方法是同步的?”

答案是:不应该,原因有两个:

  1. 它不访问任何字段,因此该方法中同时存在多个线程不会损坏任何内容。

  2. 每个线程获取对象的不同实例,从而获得不同的锁。所以synchronized修饰符没有什么区别。每个线程仍然可以进入自己实例的 move 方法,因为它们具有单独的锁。

只有当线程之间共享一些数据并且至少有一个线程正在修改该数据时,才需要同步。

关于java - 关于相同/不同对象上的 java 线程的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25458810/

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