gpt4 book ai didi

java - 方法同步线程问题

转载 作者:行者123 更新时间:2023-11-29 05:31:09 25 4
gpt4 key购买 nike

我似乎无法获得 20000 的最终计数器值。这段代码有什么问题?

public class Synchronize2 {

public static void main(String[] args) {
Threading t1 = new Threading();
Threading t2 = new Threading();

t1.start();
t2.start();

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(Threading.counter);
}
}


class Threading extends Thread {

static int counter;

public synchronized void incrementer() {
counter++;
}

public void run() {
for (int i=0; i<10000; i++) {
incrementer();
}
}
}

最佳答案

您的同步 incrementer 方法将锁定对象本身。但是您有 2 个不同的对象,每个对象都锁定自己,因此该方法不是线程安全的;两个线程仍然可以同时访问 incrementer

此外,后增量操作不是线程安全的,因为它不是原子的;有读操作和自增操作,两个操作中间可以中断一个线程。此非线程安全代码呈现竞争条件,其中线程一读取值,线程二读取值,然后线程一递增和线程二递增,但只有最后一个递增“获胜”并且一个递增丢失。当结束值小于 20000 时显示。

也使方法静态,因为它是同步的,所以它会锁定类的类对象,这里是适当的同步。

public static synchronized void incrementer() {

关于java - 方法同步线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049861/

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