gpt4 book ai didi

java - Java中简单多线程程序的奇怪问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:34:27 25 4
gpt4 key购买 nike

我刚刚开始玩多线程编程。我希望我的程序交替显示字符“-”和“+”,但事实并非如此。我的任务是使用 synchronized 关键字。据我所知:

class FunnyStringGenerator{

private char c;

public FunnyStringGenerator(){
c = '-';
}

public synchronized char next(){

if(c == '-'){
c = '+';
}
else{
c = '-';
}

return c;
}
}

class ThreadToGenerateStr implements Runnable{

FunnyStringGenerator gen;

public ThreadToGenerateStr(FunnyStringGenerator fsg){
gen = fsg;
}

@Override
public void run() {
for(int i = 0; i < 10; i++){

System.out.print(gen.next());
}
}


}

public class Main{


public static void main(String[] args) throws IOException {

FunnyStringGenerator FSG = new FunnyStringGenerator();

ExecutorService exec = Executors.newCachedThreadPool();

for(int i = 0; i < 20; i++){
exec.execute(new ThreadToGenerateStr(FSG));
}

}

}

编辑:我还在运行方法中测试 Thread.sleep 而不是 for 循环。

最佳答案

FunnyStringGenerator.next() 中的synchronized block 工作正常。它将交替返回 '+''-'

但是您在 ThreadToGenerateStr.run() 中存在竞争条件:

System.out.print(gen.next());

这相当于:

char c = gen.next(); // Synchronized
System.out.print(c); // Not synchronized

问题发生在:

  • 线程 1 调用 gen.next(),得到 '-' 的结果
  • 线程 2 调用 gen.next(),得到 '+' 的结果
  • 线程 2 调用 System.out.print(),写入“+”
  • 线程 1 调用 System.out.print(),写入 '-'

结果是'+'和'-'的顺序相反。

有多种可能的解决方法,例如:

  • 在单个 synchronized block 中同时调用 gen.next() 和 System.out.print()(如 dogbane 的回答)
  • 让 gen.next() 将字符写入流而不是返回它
  • 使 gen.next() 将字符附加到共享 BlockingQueue并有一个专用的 I/O 线程从这个队列中获取字符并打印它们。

关于java - Java中简单多线程程序的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706460/

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