我正在實現一個與ArrayList的對象稱爲自行車在它的程序。同步最大值,而一個線程添加項目和一個線程刪除項目
我維護一個變量來保存最大自行車(通過它的id測量)和一個變量來保存陣列中的最大自行車索引。
我已經implented 2個功能 - addBicycle和removeMax,他們是synchornized。
我很擔心當一個線程在addBicycle和其他線程在removeMax時可能會發生什麼 - 可能會添加新的自行車,這將是最大的,第二個線程將意外刪除舊值不再是最大值。
有沒有辦法阻止它?一種禁止一個線程同時在add函數和另一個在remove函數的方法? 感謝
編輯:代碼 -
public BicycleDataStructure() {
list = new ArrayList<T>();
maxBicycle = null;
maxBicycleIndex = 0;
}
public synchronized void addBicycle(T bToAdd) {
if (list.size() == 0) {
list.add(bToAdd);
maxBicycle = bToAdd;
maxBicycleIndex = 0;
} else {
for (int i = 0; i < list.size(); i++) {
//checks to add in the right position in the list
list.add(i, bToAdd); }
}
}
public synchronized Bicycle removeMaxBicycle() {
if (list.isEmpty()){
return null;
}
list.remove(maxBicycleIndex);
if (!list.isEmpty()) {
maxBicycle = collection.get(maxBicycleIndex- 1);
maxBicycleIndex-= 1;
}
}
「當一個線程在addBicycle中且其他線程在removeMax中」時,如果它們在同一監視器上同步,則不會發生。 –
@AndyTurner爲什麼?如果一個函數是同步的,這意味着2個線程不能同時在該函數內部,但是它們是2個不同的函數。 – user7366106
如果它們是同一實例上的同步方法,則只有一個線程可以調用任何方法一次。 –