`
trydofor
  • 浏览: 150491 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

小细节导致假调用

 
阅读更多
    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();

分享到:
评论

相关推荐

    linux操作系统课程设计完善代码

    换句话说,你必须保证用户程序不能给内核传递会导致内核破坏自己或其他进程内部状态的假参数。同时,你必须采取措施保证,当一个用户进程做任何非法的动作时,如企图访问未映射的内存或跳转到错误的地址等,该进程...

    C语言附录6错误小结

    这会导致逻辑错误,因为`a=0`的结果总是评估为`a`的值,如果`a`为0则为假,否则为真。 2. **混淆& |和&& ||运算符号** `&`和`|`是位运算符,而`&&`和`||`是逻辑运算符。例如,`1&2=0`和`1&&2=1`,它们的含义和计算...

    jQuery生成假加载动画效果

    当后台数据处理耗时较长,导致前台页面长时间显示空白时,一个假的加载动画可以很好地缓解用户的等待焦虑。本文通过一个使用PDFObject.js时遇到的加载问题,介绍了如何使用jQuery来创建一个简单的假加载动画效果。 ...

    操作系统试题.pptx

    SPOOLing系统是实现虚拟设备的一个例子,是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为”假脱机技术”。通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备...

    假api

    - **防止依赖注入**:假API可以防止因依赖实际API而导致的代码问题,特别是在API发生变化时。 - **隐私保护**:在测试过程中,假API可以避免使用真实数据,保护用户隐私和敏感信息。 6. **持续集成/持续部署(CI/...

    STM32F407固件库-WWDG—窗口看门狗.zip

    1. **HAL层(Hardware Abstraction Layer)**:这一层提供了与硬件无关的API,使得开发者可以更专注于应用层的开发,而无需关注底层硬件细节。例如,对于WWDG,HAL库提供了初始化、配置和控制窗口看门狗的函数。 2....

    Android动态加载与反射机制的静态污点分析研究.pdf

    传统的静态分析无法有效追踪动态加载的类和方法,以及反射调用的信息,从而导致分析不完整,可能遗漏潜在的安全风险。 针对这一现状,该研究提出了一种改进方法,通过修改Android源代码,使得系统在应用程序运行...

    虚拟打印机初步说明文档

    - **更高的安全性**:避免了直接访问硬件或操作系统核心导致的安全隐患。 - **丰富的API支持**:可以直接访问Win32 API,便于实现复杂功能。 - **易于调试**:相对于内核模式,用户模式下的程序更容易进行调试。 - *...

    栈题目.pdf

    - **假上溢**:顺序队列中的假上溢是指队列中有空闲空间,但由于队首和队尾的特殊位置关系而导致无法插入新元素的现象。 - **循环队列**:为了解决顺序队列的假上溢问题,引入了循环队列的概念,使得队列空间得到更...

    Bypassing non-executable-stack during exploitation using return-to-libc.pdf

    2. **构造调用序列**:然后,攻击者会构建一个调用序列,通常包括目标函数的地址、必要的参数(如`/bin/sh`用于shell命令),以及一个假的返回地址,以确保控制流正确地流向目标函数。 3. **注入调用序列**:最后,...

    用C语言实现“树的同构”

    这些是由于扫描过程中的字符识别错误导致的,需要在编写实际代码时进行修正。 此外,代码中还存在逻辑上的不一致之处,比如数组大小被定义为MaxTree,但在构建树的过程中并没有明确说明MaxTree的值如何确定,需要在...

    系统集成年终工作总结年终.docx

    成功集成的关键在于理解业务需求、合理规划、有效的沟通和对技术细节的精准把握。在今后的工作中,我们需要继续深化这些经验,提升系统集成的质量和效率,为公司业务的持续发展提供坚实的技术支持。

    C++面试题精髓

    然而,构造函数的主要作用是在创建对象时初始化对象,而在调用构造函数时,对象尚未完全构造完成,因此不能确定对象的具体类型,这与虚函数需要在运行时确定调用哪个版本的机制相矛盾,导致构造函数不能被声明为虚...

    C++/C试题的答案与评分标准

    - **问题**:在 `GetMemory` 函数中分配了内存,但未在调用者 `Test` 中释放,导致内存泄漏。 - **解决方案**:修改 `GetMemory` 返回堆内存地址,并在 `Test` 中使用后释放。 - **示例 2**:当函数需要返回动态...

    我的NodeJs学习小结(一)

    Node.js学习小结知识点详细解读: 1. 编程细节与效率: 在Node.js编程中,尽量减少不必要的操作,例如在遍历数组时通过预设循环变量的初始值和结束条件来避免每次都获取数组长度,尤其是在处理大数据量时,这样的...

    计算机操作系统期末测试题及答案解析(两套).doc

    8. **响应时间**:在分时系统中,时间片固定时,用户数量增多会导致响应时间延长,因为系统需要轮流服务更多的用户。 9. **系统调用**:用户在程序一级获取系统帮助通常需要通过系统调用,这是一种内核级别的服务...

    2021-2022计算机二级等级考试试题及答案No.12013.docx

    即使递归调用时改变了传入的`i`值,也不会影响到外部作用域的变量,从而不会导致死锁。 #### Servlet的工作机制 Servlet容器为每个客户端请求创建一个新的线程而不是进程。因此,“当多个客户请求一个servlet时,...

    自适应均衡化_matlab图像处理_自适应均衡化_

    这种方法可以更好地保留图像的局部细节,避免全局均衡化可能导致的过度增强或噪声放大。 下面我们将深入探讨自适应均衡化的基本原理、步骤以及MATLAB实现的关键点: 1. **基本原理**:自适应均衡化的目标是通过...

    进度条显示导出文件进度

    而导出文件的操作通常是一个耗时的任务,如果在这个线程上执行,会导致界面冻结,也就是所谓的“假死”状态。为了解决这个问题,我们可以使用异步编程模型,将文件导出的操作放在一个单独的线程中执行,而通过委托和...

Global site tag (gtag.js) - Google Analytics