gpt4 book ai didi

c# - Java 和 C# 线程如何以不同方式处理数据同步?

转载 作者:行者123 更新时间:2023-11-30 06:22:07 25 4
gpt4 key购买 nike

在下面的 C# 代码中,t1 总是(在我尝试的时候)完成。

class MainClass
{
static void DoExperiment ()
{
int value = 0;

Thread t1 = new Thread (() => {
Console.WriteLine ("T one is running now");
while (value == 0) {
//do nothing
}
Console.WriteLine ("T one is done now");
});

Thread t2 = new Thread (() => {
Console.WriteLine ("T two is running now");
Thread.Sleep (1000);
value = 1;
Console.WriteLine ("T two changed value to 1");
Console.WriteLine ("T two is done now");
});

t1.Start ();
t2.Start ();

t1.Join ();
t1.Join ();
}

public static void Main (string[] args)
{
for (int i=0; i<10; i++) {
DoExperiment ();
Console.WriteLine ("------------------------");
}
}
}

但是在非常相似的 Java 代码中,t1 永远不会(我尝试过)退出:

public class MainClass {
static class Experiment {
private int value = 0;

public void doExperiment() throws InterruptedException {

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {

System.out.println("T one is running now");
while (value == 0) {
//do nothing
}
System.out.println("T one is done now");
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("T two is running now");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
value = 1;
System.out.println("T two changed value to 1");
System.out.println("T two is done now");
}
}
);

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

t1.join();
t1.join();
}
}


public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
new Experiment().doExperiment();
System.out.println("------------------------");
}
}

}

这是为什么?

最佳答案

我不确定它在 C# 中是如何发生的,但在 Java 中发生的是 JVM 优化。 value 的值不会在 while 循环内改变,JVM 会识别它并跳过测试并将你的 bite 代码更改为类似这个:

while (true) {
// do nothing
}

为了在 java 中解决这个问题,您需要将 value 声明为 volatile:

private volatile int value = 0;

这将使 JVM 不优化此 while 循环并检查 value实际值> 在每次迭代开始时。

关于c# - Java 和 C# 线程如何以不同方式处理数据同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19710375/

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