屬性我想建立...這個BoundedBuffer類的問題在哪裏?有界緩衝區類的
- 多生產,多消費。
- 阻止生產者和阻止消費者。
- 使用AtomicInteger作爲讀/寫指針。
- 使用AtomicReferenceArray(取一般類型)來保存緩衝區。
- 緩衝區是Short.MAX_VALUE大小,它使用CAS來處理溢出。
現在的問題...
問題:我似乎無法註釋掉同步(這)塊在下面的代碼。我認爲使用AtomicInteger作爲指針的重點是避免這樣做。
註釋掉缺少消費者,生產商已經把一些項目同步(這)塊的產量。如果我有同步(這)塊,一切的偉大和生產消耗的每一件事情。
我錯過了什麼?
public class BoundedBuffer<T> {
private static final int BUFFER_SIZE = Short.MAX_VALUE+1;
private AtomicReferenceArray<T> m_buffer = null;
private Semaphore m_full = new Semaphore(BUFFER_SIZE);
private Semaphore m_empty = new Semaphore(0);
private AtomicInteger m_writePointer = new AtomicInteger();
private AtomicInteger m_readPointer = new AtomicInteger();
public BoundedBuffer() {
m_buffer = new AtomicReferenceArray<T>(BUFFER_SIZE);
}
public static int safeGetAndIncrement(AtomicInteger i) {
int oldValue = 0, newValue = 0;
do {
oldValue = i.get();
newValue = (oldValue == Short.MAX_VALUE) ? 0 : (oldValue + 1);
} while (!i.compareAndSet(oldValue, newValue));
return oldValue;
}
public void add(T data) throws InterruptedException {
m_full.acquire();
synchronized (this) { // << Commenting this doesn't work
// CAS-based overflow handling
m_buffer.set(safeGetAndIncrement(m_writePointer),data);
}
m_empty.release();
}
public T get() throws InterruptedException {
T data = null;
m_empty.acquire();
synchronized (this) { // << Commenting this doesn't work
// CAS-based overflow handling
data = m_buffer.get(safeGetAndIncrement(m_readPointer));
}
m_full.release();
return data;
}
}
可能的重複[在java中編寫線程安全的阻塞有界緩衝區結構時如何處理索引溢出?](http://stackoverflow.com/questions/7374032/how-do-you-deal-with -index-overflow-when-writing-a-thread-safe-blocking-bounded-b) –
在'safeGetAndIncrement'中編寫了'...(oldValue == Short.MAX_VALUE)...'。這應該是'...(oldValue == BUFFER_SIZE - 1)...'。這是一個小問題,但除此之外,如果您決定將BUFFER_SIZE更改爲其他值,則需要更改此行,否則代碼將會中斷。 –
@Adrian我已經修復了,因爲我發佈了代碼。我也意識到這一點。感謝您指出了這一點。 – TechnoJab