关键词没有排名的网站怎么做,网站织梦程序改成wordpress,anylink wordpress,小程序哪家好实现全局自增id最简单有效的方式是什么#xff1f; java.util.concurrent.atomic 包定义了一些常见类型的原子变量。这些原子变量为我们提供了一种操作单一变量无锁( lock-free )的线程安全( thread-safe )方式。实际上该包下面的类为我们提供了类似 volatile 变量的特性…实现全局自增id最简单有效的方式是什么 java.util.concurrent.atomic 包定义了一些常见类型的原子变量。这些原子变量为我们提供了一种操作单一变量无锁( lock-free )的线程安全( thread-safe )方式。实际上该包下面的类为我们提供了类似 volatile 变量的特性同时还提供了诸如 boolean compareAndSet(expectedValue, updateValue) 的功能。不使用锁实现线程安全听起来似乎很不可思议这其实是通过CPU的compare and swap指令实现的由于硬件指令支持当然不需要加锁了。先不去讨论这些细节我们来看一下原子变量的用法。一个典型的用法是可以使用原子变量轻松实现全局自增id就像下面这样// 线程安全的序列id生成器class Sequencer {private final AtomicLong sequenceNumber new AtomicLong(0);publiclongnext() {return sequenceNumber.getAndIncrement();}}上述代码利用AtomicLong创建了一个Sequencer类不断调用该类的next()方法就可以得到线程安全的自增id用起来非常简单直观。下面我们给出每种原子变量类型的用法说明。AtomicInteger and AtomicLongAtomicInteger 和 AtomicLong 分别代表原子类型的整型和长整型这两个类提供十分相似的功能仅仅是位宽不同。如上例所示原子整型可用于多线程下全局自增id除此之外还提供了原子 比较-赋值 等操作诸如 compareAndSet(expect, update) decrementAndGet() getAndDecrement() getAndSet(newValue) 等等更全面的接口描述可参考JDK文档。需要提醒的是这些函数都是通过原子CPU指令实现执行效率较高。原子整型看似跟普通整型( Integer, Long )类型相似但不能使用原子整型替代普通整型因为原子整型是可变的而普通整型不可变。由于这个原因使用原子整型作为Map的key并不是个好主意。你可能会想当然的以为应该有 AtomicFloat 和 AtomicDouble 遗憾的是类库里并没有这两个类型 AtomicByte 和 AtomicShort 也没有。如果需要替代方案是使用 AtomicInteger 和 AtomicLong 。可通过 Float.floatToRawIntBits(float) 和 Float.intBitsToFloat(int) 将Float存储到 AtomicInteger 中类似的Double类型也可以存储到 AtomicLong 中。AtomicReferenceAtomicReference 用于存放一个可以原子更新的对象引用。该类包含 get() , set() , compareAndSet() , getAndSet() 等原子方法来获取和更新其代表的对象引用。AtomicXXXArrayatomic包下面有三种原子数组 AtomicIntegerArray , AtomicLongArra , AtomicReferenceArray 分别代表整型、长整型和引用类型的原子数组。原子数组使得我们可以线程安全的方式去修改和访问数组里的单个元素。简单示例如下// 原子数组示例AtomicLongArray longArray new AtomicLongArray(10);// 创建长度为10的原子数组longArray.set(1, 100);long v longArray.getAndIncrement(1);AtomicReferenceArray referenceArray new AtomicReferenceArray(16);referenceArray.set(3, love);referenceArray.compareAndSet(3, love, you);简单来说原子数组就是一种支持线程安全的数组仍然具有数组“定长”的性质如果访问元素超过了数组的长度将会抛出 IndexOutOfBoundsException 。你可能已经想到了可以使用线程安全的容器来避免容量不足我们会在后续章节介绍。什么是线程安全线程安全是指多线程访问是时无论线程的调度策略是什么程序能够正确的执行。导致线程不安全的一个原因是状态不一致如果线程A修改了某个共享变量(比如给id)而线程B没有及时知道就会导致B在错误的状态上执行结果的正确性也就无法保证。原子变量为我们提供了一种保证单个状态一致的简单方式一个线程修改了原子变量另外的线程立即就能看到这比通过锁实现的方式效率要高如果要同时保证多个变量状态一致就只能使用锁了。欢迎加入学习交流群569772982大家一起学习交流。