2009-01-12 222 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; 
} 

}