tim*_*ann 8 java multithreading atomic atomicinteger
我在Oracle文档中读过:
- 读取和写入对于引用变量和大多数 原始变量(除long和double之外的所有类型)都是原子的.
(我想这个功能已经在一些新的JDK版本中添加了,因为我曾经认为所有原始变量的读/写都不是原子的)
这是否意味着AtomicInteger已弃用且不应在新项目中使用?
5go*_*der 17
虽然普通的单个存储或普通的单个加载int在Java中是原子的,但是你不能原子地增加它.这样做需要先加载值,然后根据它计算新值,然后再存储新值.但是在两次访问之间,另一个线程可能已经修改了该值.AtomicInteger提供这样的操作getAndIncrement可以用于此目的而无需使用锁.
已过时?一点也不.虽然原始变量的单独读取和写入是原子的,AtomicInteger(以及其他原子类java.util.concurrent.atomic)提供了更复杂的操作,这些操作也是原子的.这些包括诸如addAndGet(int)原始int变量完全不是原子的东西.从而,
int i = 3;
AtomicInteger j = new AtomicInteger(3);
i += 5; // NOT thread-safe -- might not set i to 8
int n = j.addAndGet(5); // thread-safe -- always sets n to 8
Run Code Online (Sandbox Code Playgroud)
(这两种意见的上面是假设下i,并j没有被讨论的发言时间改变开始执行,但可能被执行开始之后,但它完成之前另一个线程来改变.)
是否意味着AtomicInteger已弃用且不应在新项目中使用?
不,首先也是最明显的,如果它被弃用,它将被标记为这样.
此外,AtomicInteger和原始int根本不可互换.有很多不同之处,但这里有前三个想到的:
compareAndSet(),在原语上不可用.AtomicInteger.getAndIncrement()与之相比int++也是不同的; 前者是原子的,第二个是两个非原子的操作.我想这个功能已经在一些新的JDK版本中添加了,因为我曾经认为所有原始变量的读/写都不是原子的
读取和写入32位或更小的基元始终是原子的.
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |