我有一段代码来创建一个对象并增加创建对象的数量。创建对象并增加计数的代码由 if 条件检查是否已达到 MAX 个对象。当使用多线程运行代码时,if 条件可能会被破坏(即无效),这取决于行的位置增加计数。这可能是由 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 编译器优化的代码?
谢谢你。