gpt4 book ai didi

java - for循环中的同步方法

转载 作者:行者123 更新时间:2023-11-30 08:56:47 25 4
gpt4 key购买 nike

在下面的简单示例代码中(主要取自 nice udemy video),有两个线程通过 synchronized 方法递增 count 实例变量。

然而,此方法位于每个线程的 for 循环中。

我的问题是:在这种情况下,线程是否可能实际上混合了它们对 increment 的调用?例如:

Thread 1 calls increment for i = 0

Thread 1 calls increment for i = 1

Thread 2 calls increment for j = 0

Thread 2 calls increment for j = 1

Thread 1 calls increment for i = 2

Thread 2 calls increment for j = 2

... and so on

我尝试为大型 ij 多次运行它,但它们总是按顺序显示,即

Thread 1 calls increment for i = 0

Thread 1 calls increment for i = 1

Thread 1 calls increment for i = 2

... Thread 1 finishes

Thread 2 calls increment for j = 0

Thread 2 calls increment for j = 1

... Thread 2 finishes

根据我对 synchronized 关键字的理解,第一种情况应该会发生,所以我只是想知道我是否看到第二种情况,因为我有可能遗漏了其他东西。

 public class SyncTest {

private int count = 0;

public static void main(String[] args) {
SyncTest test = new SyncTest ();
test.doWork();
}

public synchronized void increment(String threadName) {
System.out.println("thread: " + threadName);
count++;
}

public void doWork() {

Thread t1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100000; i++) {
increment("t1");
}
}
});

Thread t2 = new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 100000; j++) {
increment("t2");
}
}
});

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

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

System.out.println("Count is: " + count);
}
}

最佳答案

Based on my understanding on the synchronized keyword, the first case should happen, so I am just wondering if I am seeing the second case due to chance of there is something else that I am missing.

你的理解是正确的。

事实上,当我运行您的确切代码时,我得到了一系列 t1,然后是一系列 t2,然后是 t1s,然后是 t2s 等等。这清楚地表明线程正在相互抢占,并且没有我们忽略的微妙的意外同步。

关于java - for循环中的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28464600/

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