gpt4 book ai didi

java - 为什么我的同步方法不能正常工作?

转载 作者:行者123 更新时间:2023-12-01 17:50:08 25 4
gpt4 key购买 nike

我有一个打印计数器的同步方法,我有 4 个线程,所以我期望计数器的最终值为 400000,因为我的计数器是一个静态变量。

但是每次我运行代码时,它都会给我不同的计数器值。

以下是我的代码:

class MyThread implements Runnable{

private static int counter=1;
@Override
public void run() {
try {
this.syncMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void syncMethod() throws InterruptedException{
for(int i=0;i<100000;i++){
System.out.println(Thread.currentThread().getName()+" : "+counter++);
}
}
}

public class MyController {
public static void main(String[] args) throws InterruptedException {
Runnable r1=new MyThread();
Runnable r2=new MyThread();
Runnable r3=new MyThread();
Runnable r4=new MyThread();
Thread t1;
Thread t2;
Thread t3;
Thread t4;
t1=new Thread(r1,"Thread 1");
t2=new Thread(r2,"Thread 2");
t3=new Thread(r3,"Thread 3");
t4=new Thread(r4,"Thread 4");

t2.start();
t1.start();
t3.start();
t4.start();
}
}

最佳答案

该变量是静态,但您同步的方法不是静态。这意味着它将获取当前实例的监视器,并且每个线程都有不同的当前实例。

一个简单的解决方案是将 syncMethod 方法也设置为 static;在这种情况下,它将锁定由 MyThread 类的所有实例共享的监视器:

public static synchronized void syncMethod()

关于java - 为什么我的同步方法不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51129585/

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