zoukankan      html  css  js  c++  java
  • Volatile arrays in Java

    Volatile arrays in Java

    A slight complication of Java volatile fields, and one sometimes overlooked, is that declaring an array volatile does not give volatile access to its fields!. At least, it doesn't when elements of the array are accessed with "normal" Java syntax. In other words:

    • it is unsafe to call arr[x] = y on an array (even if declared volatile) in one thread and then expect arr[x] to return y from another thread;
    • on the other hand, it is safe to call arr = new int[] (or whatever) and expect another thread to then read the new array as that referenced by arr: this is what is meant by declaring the array reference volatile.

    So, what do we do if we want a truly volatile array in Java, where the array's individual fields have volatile semantics?

    Solution 1: use AtomicIntegerArray or AtomicLongArray

    The AtomicIntegerArray class implements an int array whose individual fields can be accessed with volatile semantics, via the class's get() and set() methods. Calling arr.set(x, y) from one thread will then guarantee that another thread calling arr.get(x) will read the value y (until another value is read to position x).

    Solution 2: re-write the array reference after each field write

    This is slightly kludgy and slightly inefficient (since what would be one write now involves two writes) but I believe it is theoretically correct. After setting an element of the array, we re-set the array reference to be itself:

    volatile int[] arr = new int[...];
    ...
    arr[4] = 100;
    arr = arr;
    

    The marginal benefit of this technique could be:

    • it may allow you to fix some broken code with minimal changes if you have code already (incorrectly) using a volatile array and expecting thread-safe element access;
    • it saves us creating the wrapper object around the array (which is what happens with IntegerArray and LongArray);
    • it's more or less the only option for array types with no available atomic wrapper (e.g. a float array).
  • 相关阅读:
    axios跨域问题(包括开发环境和生产环境)
    vue高亮一级、二级导航
    vue配置路由时报错 Error in render: "RangeError: Maximum call stack size exceeded"
    win10使用L2TP连接失败,报远程服务器未响应错误解决办法,亲测可用!
    pywinauto教程
    Python结合Pywinauto 进行 Windows UI 自动化
    Pywinauto自动化操作PC微信提取好友微信号
    Debian9 配置kali(xfce4、Metasploit、wireshark)
    Kali开启ssh
    从域环境搭建到域渗透
  • 原文地址:https://www.cnblogs.com/ydxblog/p/8021882.html
Copyright © 2011-2022 走看看