我有一段代碼來創建一個對象並增加創建對象的數量。創建對象和增加計數的代碼,如果條件檢查計數是否達到了最大數量的對象,則通過if條件進行檢查。當使用多線程運行代碼時,if條件可能被違反(即無效)由行的位置決定。這可能是由Java編譯器優化造成的嗎?以下是代碼片段:Java編譯器代碼優化違反條件?
private BlockingQueue<WeakReference<ItemType>> items;
private final ReferenceQueue<ItemType> referenceQueue = new ReferenceQueue<ItemType>();
private final int maxSize = 10;
private final AtomicInteger numberOfCreatedObj = new AtomicInteger(0);
protected ItemType create(boolean addToCache) {
ItemType item = null;
try {
if (!hasCreatedMaxObjects()) {
// we have not reached maxSize yet.
item = getFactory().create();
// this position makes the MAX objects checking working
// Position A:
increaseCreatedObjectCount();
LOG.debug("Created new item [" + item.getId() + "]");
if (addToCache) {
LOG.debug("Add to cache the new item [" + item.getId() + "]");
addCreated(item);
}
// This position makes the MAX objects checking failed
// Position B;
//increaseCreatedObjectCount();
} else {
LOG.warn("Already reached MAX created objects " + numberOfCreatedObj.get());
}
} catch (Exception e) {
LOG.error("Error in creating a new object", e);
}
return item;
}
protected boolean hasCreatedMaxObjects() {
return getNumberOfCreatedObj().compareAndSet(getMaxSize(), getMaxSize());
}
protected void increaseCreatedObjectCount() {
getNumberOfCreatedObj().incrementAndGet();
}
protected void addCreated(ItemType item) {
items.offer(new WeakReference<ItemType>(item, referenceQueue));
}
我用30個線程運行了我的測試。獲得創建的對象後,每個線程休眠100毫秒。當在位置A調用increaseCreatedObjectCount()時,代碼工作正常,並且創建了10個(MAX)對象。當在位置B調用increaseCreatedObjectCount()時,創建了30個對象,這等於正在運行的線程的數量。
如何查看Java編譯器優化代碼?
謝謝。
預期結果是什麼,實際結果是什麼?目前還不清楚問題是什麼。 –
這是什麼*問題* – EJP
預期結果:只創建不超過最大尺寸的對象。 – qwang