java并发AtomicIntegerFieldUpdater
支持对象的成员变量原子操作类由AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,
AtomicReferenceFieldUpdater。
AtomicIntegerFieldUpdater的使用特点
它的API我还无法细致的掌握,它的使用有三点注意事项:
1.成员变量不能是私有的
2.int类型必须是volatile
3.它的实现是基于反射
以前有同事说过能不用反射就不要反射,很危险。我在写下面例子的时候,没有保证上面的两点,结果写的没有报错,
但在运行时候就报错了,我们应该知道编译期的错误IDE都能检查出来,可见反射用得不好,只有运行才能发现。
我认为它的实现之所以是基于反射就是因为成员变量的使用恰恰实在运行期。
下面的例子就是这样的一个示范。
简单例子
package javalearn.javabase.thread.atomic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
@Slf4j
public class AtomicLongfiledupdaterTest {
public static void main(String[] args) {
//AtomicLongFieldUpdater atomicLongFieldUpdater;
//AtomicReferenceFieldUpdater atomicReferenceFieldUpdater;
AtomicIntegerFieldUpdater atomicIntegerFieldUpdater =AtomicIntegerFieldUpdater.newUpdater(Persion.class
,"id");
Persion p1 =new Persion("jack",1);
log.info("persion p1 is {}",p1.toString());
atomicIntegerFieldUpdater.getAndIncrement(p1);
log.info("persion p1 is {}",p1.toString());
}
@AllArgsConstructor
@Data
@ToString
static class Persion {
protected String name;
protected volatile int id;
}
}
例子结果
22:50:00.418 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=1)
22:50:00.425 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=2)
Process finished with exit code 0