【发布时间】:2012-02-17 01:31:39
【问题描述】:
这不是家庭作业对我来说,这是一些大学给学生的任务。出于个人兴趣,我对解决方案感兴趣。
任务是创建一个包含整数的类(Calc)。 add 和 mul 这两个方法应该与这个整数相加或相乘。
同时设置两个线程。一个线程应该调用 c.add(3) 十次,另一个线程应该调用 c.mul(3) 十次(当然是在同一个 Calc 对象上)。
Calc 类应确保操作交替完成(add、mul、add、mul、add、mul、..)。
我没有经常处理与并发相关的问题 - 更不用说 Java。我为 Calc 提出了以下实现:
class Calc{
private int sum = 0;
//Is volatile actually needed? Or is bool atomic by default? Or it's read operation, at least.
private volatile bool b = true;
public void add(int i){
while(!b){}
synchronized(this){
sum += i;
b = true;
}
}
public void mul(int i){
while(b){}
synchronized(this){
sum *= i;
b = false;
}
}
}
我想知道我是否在正确的轨道上。 while(b) 部分肯定有更优雅的方式。 我想听听你们的想法。
PS:方法的签名不得更改。除此之外,我不受限制。
【问题讨论】:
-
您可以改用AtomicBoolean & AtomicInteger。
-
@AviramSegal - 详细说明:这是 1 个线程连续调用 mul() 十次。不是十个线程每个调用 mul()。
-
线程安全与否,任何以这种方式使用布尔值作为学生作业的人都应该被淘汰。字段名称
b。太好了,太好了。 -
@owlstead 嗯,我永远不会命名这样的布尔值。但是因为示例代码太短了,我觉得它并不是真正需要的。 Ab(使用)布尔值作为一种开关也很丑陋,但是我真的只关心线程安全部分。
-
虽然我确实理解简洁的要求,但我确实看到很多新的开发人员似乎接管了这种简洁,我不得不忍受他们产生的代码。但请原谅我跑题了。关键是即使它是线程安全的,也不是要走的路。
标签: java multithreading concurrency synchronized