2009-01-12 297 views

回答

4

你所說的「同步」的意思?如果你的讀者&作家是在單獨的線程,你想要的FIFO爲「正確」處理併發,包括這些細節:

  • 正確使用FIFO API的不應該導致數據結構被破壞
  • 正確使用FIFO API不應導致死鎖(儘管應該有一個機制讓讀者等到有東西要讀)
  • 從FIFO中讀取的對象應該是相同的對象,以相同的順序寫入先進先出(不應該有丟失的對象或重新安排的順序)
  • 應該有一個有界時間(人們會希望!)在作者將什麼東西放入FIFO中以及何時可供讀者使用。

在Java世界裏有一本好書,Java Concurrency In Practice。有多種方法可以實現正確處理併發性的FIFO。最簡單的實現是阻塞,更復雜的實現使用基於大多數處理器上的比較和交換指令的非阻塞算法。

2

是的,如果讀寫器與來自不同線程的FIFO隊列交互。

0

取決於實施,但最有可能的。你不希望讀者讀取部分寫入的數據。

0

是的,除非其文件另有明確說明。

(這是可能的,如果有使用InterlockedXXX功能只有一個閱讀器和一個寫線程,例如,在Windows上實現一個專門的FIFO,這並不需要同步。)

1

嘗試併發FIFO使用此代碼:

public class MyObjectQueue { 

private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 

private static final ReadLock readLock; 

private static final WriteLock writeLock; 

private static final LinkedList<MyObject> objects; 

static { 
    readLock = lock.readLock(); 
    writeLock = lock.writeLock(); 
    objects = new LinkedList<MyObject>(); 
} 

public static boolean put(MyObject p) { 
    writeLock.lock(); 
    try { 
     objects.push(p);    
     return objects.contains(p); 
    } finally { 
     writeLock.unlock(); 
    } 
} 

public static boolean remove(MyObject p) { 
    writeLock.lock(); 
    try { 
     return objects.remove(p);   
    } finally { 
     writeLock.unlock(); 
    } 
} 

public static boolean contains(MyObject p) { 
    readLock.lock(); 
    try { 
     return objects.contains(p);   
    } finally { 
     readLock.unlock(); 
    } 
} 

public MyObject get() { 
    MyObject o = null; 
    writeLock.lock(); 
    try { 
     o = objects.getLast(); 
    } catch (NoSuchElementException nse) { 
     //list is empty 
    } finally { 
     writeLock.unlock(); 
    } 
    return o; 
} 

}