【发布时间】:2013-07-15 02:17:29
【问题描述】:
我有一段代码来创建一个对象并增加创建对象的数量。创建对象并增加计数的代码由 if 条件检查是否已达到最大对象数。使用多线程运行代码时,可能会违反 if 条件(即无效),这取决于行的位置增加计数。这可能是由 Java 编译器优化引起的吗?以下是sn-ps的代码:
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 编译器优化的代码?
谢谢。
【问题讨论】:
-
预期结果是什么,实际结果是什么?目前还不清楚问题是什么。
-
这里的问题是什么?
-
预期结果:只创建不超过最大尺寸的对象。
-
实际结果:在位置 A 调用 increaseCreatedObjectCount() 时,代码工作正常,创建了 10 个(MAX)对象。在位置 B 调用 increaseCreatedObjectCount() 时,创建了 30 个对象,等于运行的线程数。
标签: java optimization if-statement compiler-construction conditional-statements