Eli*_*eth 3 java concurrency multithreading
我刚开始玩多线程编程.我希望我的节目交替显示字符' - '和'+',但事实并非如此.我的任务是使用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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我也在Thread.sleeprun方法中测试而不是for循环.
您的synchronized阻止FunnyStringGenerator.next()工作正常.它将返回'+'并'-'交替.
但是你有一个竞争条件ThreadToGenerateStr.run():
System.out.print(gen.next());
Run Code Online (Sandbox Code Playgroud)
这相当于:
char c = gen.next(); // Synchronized
System.out.print(c); // Not synchronized
Run Code Online (Sandbox Code Playgroud)
问题发生在:
结果是'+'和' - '以相反的顺序写入.
有各种可能的解决方法,例如:
synchronized块中调用gen.next()和System.out.print()(如dogbane的答案)| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |