创建原子类型
对于简单的多线程代码,使用同步是可以接受的。但是,使用同步确实会产生实时性影响,并且随着代码库变得越来越复杂,最终会出现死锁 ,饥饿或动态锁定的可能性。
在更复杂的并发性的情况下,使用原子变量通常是更好的选择,因为它允许以线程安全的方式访问单个变量,而无需使用同步方法或代码块的开销。
创建 AtomicInteger
类型:
AtomicInteger aInt = new AtomicInteger() // Create with default value 0
AtomicInteger aInt = new AtomicInteger(1) // Create with initial value 1
与其他实例类型类似。
AtomicIntegerArray aIntArray = new AtomicIntegerArray(10) // Create array of specific length
AtomicIntegerArray aIntArray = new AtomicIntegerArray(new int[] {1, 2, 3}) // Initialize array with another array
其他原子类型也是如此。
有一个明显的例外,没有 float
和 double
类型。这些可以通过 Float.floatToIntBits(float)
和 Float.intBitsToFloat(int)
用于 float
以及 Double.doubleToLongBits(double)
和 Double.longBitsToDouble(long)
用于双打来模拟。
如果你愿意使用 sun.misc.Unsafe
,你可以使用 sun.misc.Unsafe
中的原子操作将任何原始变量用作原子。所有基本类型都应该以 int 或 long 转换或编码,以便以这种方式使用它。有关详细信息,请参阅: sun.misc.Unsafe 。