private final A9Loader<List<E>> loader;
private final ThreadFactory factory;
private final int latch;
private final Semaphore procOrder = new Semaphore(0, false);
private final ExtedEntryA9cq<E> entryA9cq = new ExtedEntryA9cq<E>(false, 0);
private volatile int procLatch;
private volatile Future<E> refFuture;
... ...
private Future<E> asyncLoad() {
//check loading
final Future<E> current = refFuture;
if (current != null) return current;
// async load
ExecutorService executor = Executors.newSingleThreadExecutor(factory);
final Future<E> result = executor.submit(new Callable<E>() {
public E call() throws Exception {
final E nul = null;
try {
List<E> ls = loader.heavyLoad();
if (ls != null && ls.size() > 0) {
entryA9cq.append(ls);
}
procLatch = latch;
}
catch (Exception e) {
if (procLatch > 0) {
procLatch = -1;
loader.handleException(e);
}
else {
throw e;
}
}
finally {
try {
procOrder.acquire(); // waiting for 'refFuture = result'
}
finally {
refFuture = null;
}
}
return nul; // only a blocking mark
}
});
executor.shutdown();
refFuture = result;
procOrder.release();
上面的代码有问题,可能导致外层调用者永远进不到 "// async load 块"。
若是 while(true)调用,那么就死循环了。
(其中:entryA9cq 的方法都能保证原子性)
修改如下:
finally {
procOrder.acquireUninterruptibly(); // waiting for 'refFuture = result'
refFuture = null;
}
return nul; // only a blocking mark
}
});
refFuture = result;
procOrder.release(); // ensure the release.
executor.shutdown();
分享到:
相关推荐
堆栈帧,函数调用,堆栈切换 函数调用过程种种细节分析
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节.docx
一个简单的使用opencv调用摄像头的小程序,可以实现简单的拍照,录像
C#编写的Winform程序,可以丢在服务器定时调用接口,无需配置,比Win服务方便一点,源码开放可自行拓展
winform调用打印机winform调用打印机winform调用打印机
Matlab调用Maple(小技巧).pdf
此代码为小程序调用蓝牙打印机完整代码,有蓝牙打印机的情况下可直接扫码进行真机调试
delphi调用C# DLL
C#调用java,可以直接调用.jar和.class文件,无需生成.net组件,更稳定快速
易语言动态调用DLL(含内存DLL调用)
网页调用OCX 网页调用Activex html调用OCX html调用Activex
挺好用的webservice开发工具.直接输入webservice地址,然后输入入参,即可调用.
webservice的动态调用和静态调用。静态调用是指添加web引用的方式调用。动态调用是指通过反射等方式在代码中加载。
jquery跨域调用,js跨域调用,jsonp,跨域调用
.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子
有时外部程序调用SAP 的RFC, 实现与SAP程序的接口, 是以外部程序为主; 现在终于找到以SAP程序为主调用外部程序的方法了. 就是SAP 的ABAP语言调用 DLL文件中的函数实现一些功能, 例如可以用DLL文件连接外部数据库...
编写QT的dll,QT调用QT的dll,QT调用外部的dll,MFC程序调用QT的dll,
VC++调用大漠插件的实例,多线程调用。
1,chrome 浏览器本身不支持直接调用exe,但可以使用url protocol handler 调用exe 2,直接双击exe_chrome.reg 安装注册表 3,test.html 要在运行在容器里(tomcat,resin XXXX),本地直接打开是执行不了的,我...
提供了完整的调用输入法类,并提供了调用该类的示例