gpt4 book ai didi

java - 两个线程在 "this"上同步调用增量方法,所用时间低于预期

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

计数为:20000 已用时间:5001

当我键入以下代码时,我得到这个结果,我有一个类,它有一个计数变量,该变量在“this”的同步块(synchronized block)中递增,为什么当我在主线程中创建一个新的Exercise对象,然后在2个线程中创建一个新对象时2 个匿名可运行的调用 ex.increment 是否只需要 5 秒?总共不应该是 10 秒吗,因为一个线程获取了锁,并且它在工作,而另一个线程应该等待?我明白了同步的想法,但我只是很困惑为什么如果我要让Exercise实现可运行并将其传递给Thread()构造函数,那么需要10秒,但不是这样,请解释一下,谢谢。

public class Exercise {
private int count = 0;

public int getCount() {
return count;
}

public void increment() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
for (int i = 0; i < 10000; i++) {
count++;
}
}
}
}

public class App {
public static void main(String[] args) {
Exercise ex = new Exercise();

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});

long start = System.currentTimeMillis();

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

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

long end = System.currentTimeMillis();

System.out.println("Count is: " + ex.getCount() + " Time elapsed: " + (end - start));
}
}

最佳答案

两个线程几乎并行地 hibernate 5 秒。

然后某个线程进入同步块(synchronized block)并立即运行循环。然后另一个线程也做同样的事情。

这里没有什么奇怪的。

关于java - 两个线程在 "this"上同步调用增量方法,所用时间低于预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217800/

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