這對我來說不是作業,這是給一些大學的學生的任務。我對這個解決方案不感興趣。這個java類線程安全嗎?
任務是創建一個包含整數的類(Calc)。這兩個方法添加和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;
}
}
}
我想知道我是否在正確的軌道上。 (b)部分肯定有更優雅的方式。 我想聽聽你們的想法。
PS:方法的簽名不得改變。除此之外,我不受限制。
您可以使用[的AtomicBoolean(http://docs.oracle.com/javase/6/docs/api/java/util/:
我個人有一對信號燈的實現這個併發/原子/ AtomicBoolean.html)和[AtomicInteger](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html)。 – CoolBeans
@AviramSegal - 詳細說明:這是一個線程調用mul()連續十次。不是每個調用mul()的十個線程。 – s3rius
線程安全與否,任何以這種方式使用布爾值作爲學生作業的人都應該被激發。字段名稱'b'。太好了,太好了。 –