gpt4 book ai didi

java - 为什么当我的类中的计数器较大时,java 线程的行为有所不同?

转载 作者:行者123 更新时间:2023-12-01 07:26:01 24 4
gpt4 key购买 nike

这是我的代码:

public class MyRunnableClass implements Runnable {

static int x = 25;
int y = 0;
private static final Object sharedLock = new Object();


@Override
public void run() {
while(x>0){
someMethod();
}
}

public synchronized void someMethod(){
synchronized (sharedLock){
x--;
y++;
}
}
}

和测试类:

public class MyRunnableClassTest {

public static void main(String[] args) throws InterruptedException {

MyRunnableClass aa = new MyRunnableClass();
MyRunnableClass bb = new MyRunnableClass();

Thread a = new Thread(aa);
Thread b = new Thread(bb);

a.start();
b.start();

a.join();
b.join();

System.out.println(aa.y + bb.y);

}
}

当我按原样运行此代码时,我看到输出 25,这很好,但是当 x 为 250 时,我看到 251.. 为什么?为什么不是250?

最佳答案

您必须扩展 synchronized 范围,以便它也涵盖 x 上的读取操作:

@Override
public void run() {
for (;;) {
synchronized (sharedObject) {
if (x <= 0) break;
someMethod();
}
}
}

关于java - 为什么当我的类中的计数器较大时,java 线程的行为有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561974/

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