2017-06-21 9 views
2

我正在實現一個與ArrayList的對象稱爲自行車在它的程序。同步最大值,而一個線程添加項目和一個線程刪除項目

我維護一個變量來保存最大自行車(通過它的id測量)和一個變量來保存陣列中的最大自行車索引。

我已經implented 2個功能 - addBicycleremoveMax,他們是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; 

    } 


} 
+1

「當一個線程在addBicycle中且其他線程在removeMax中」時,如果它們在同一監視器上同步,則不會發生。 –

+0

@AndyTurner爲什麼?如果一個函數是同步的,這意味着2個線程不能同時在該函數內部,但是它們是2個不同的函數。 – user7366106

+6

如果它們是同一實例上的同步方法,則只有一個線程可以調用任何方法一次。 –

回答

1

您正在使用synchronized方法由於以下原因,所以它是安全的

在 上同步方法的兩次調用不可能相同對象交錯。當一個線程正在爲一個對象執行同步的 方法時,所有其他線程將調用同一個對象塊的同步 方法,直到第一個 線程與該對象一起完成爲止。其次,當一個同步方法退出時,它會自動建立 之後發生的關係,同時調用同一個對象的同步方法。這保證了對對象狀態的更改 對所有線程均可見。

-1

以您目前的執行情況,你希望它不會工作。​​關鍵字只是防止兩個線程不能同時訪問該代碼塊。然而,你得到的是兩種不同的方法,你描述的情況可能會發生。

當你需要同步兩種方法,可以考慮使用旗語:

private static final int MAX_AVAILABLE = 1; 
private final Semaphore semaphore = new Semaphore(MAX_AVAILABLE, true); 

public Bicycle removeMaxBicycle(){ 
    semaphore.acquire(); 
    //do your critical stuff 
    semaphore.release(); 
} 

public void addBicycle(T bToAdd) { 
    semaphore.acquire(); 
    //do your critical stuff 
    semaphore.release(); 
} 

如果您有如何在Java中使用的信號燈有任何疑問,結賬此鏈接:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

+0

這顯然是錯誤的。兩種方法都使用相同的鎖(this),因此如果一個線程執行一個方法,則其他線程不能執行另一個方法。 –

相關問題