gpt4 book ai didi

java - 为什么在这个多线程程序中没有同步访问synchronized方法呢?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:26 25 4
gpt4 key购买 nike

我已经用 java 和同步方法编写了一些多线程代码来更改变量,但它没有同步我的代码,我仍然得到随机值。这是我的代码:

public class Main {
public static void main(String[] args) throws Exception {
Resource.i = 5;
MyThread myThread = new MyThread();
myThread.setName("one");
MyThread myThread2 = new MyThread();
myThread.start();
myThread2.start();
myThread.join();
myThread2.join();
System.out.println(Resource.i);
}
}
class MyThread extends Thread {
@Override
public void run() {
synMethod();
}

private synchronized void synMethod() {
int i = Resource.i;
if(Thread.currentThread().getName().equals("one")) {
Thread.yield();
}
i++;
Resource.i = i;
}
}

class Resource {
static int i;
}

有时我得到 7,有时 6,但我已经同步了 synMethod,据我所知,在其他线程执行此方法时,任何线程都不应进入此方法,因此操作应该是原子的,但它们不是,我不明白为什么?您能否向我解释一下,然后回答 - 我该如何解决?

最佳答案

添加synchronized 方法就像在this 上同步。由于您有两个不同的线程实例,它们不会相互锁定,并且这种同步实际上没有做任何事情。

为了使同步生效,您应该在一些共享资源上进行同步。在您的示例中,Resource.class 可能是一个不错的选择:

private void synMethod() { // Not defined as synchronized
// Synchronization done here:
synchronized (Resource.class) {
int i = Resource.i;
if (Thread.currentThread().getName().equals("one")) {
Thread.yield();
}
i++;
Resource.i = i;
}
}

关于java - 为什么在这个多线程程序中没有同步访问synchronized方法呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38939865/

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