`
linhui_dragon
  • 浏览: 156220 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java 原子类 java.util.concurrent.atomic

 
阅读更多

Java 原子类 java.util.concurrent.atomic

 

1、i++为什么是非线程安全的

i++其实是分为3个步骤:获取i的值, 把i+1, 把i+1的结果赋给i

如果多线程执行i++操作,没有同步的话,结果可能不正确

如两个线程同时获取i的值,然后各自+1后,赋给i。正确的情况下i的值应该是加了2,但这里其实加了1而且,前面的结果被覆盖了。

通常做法:synchronized (synchronized方法,synchronized变量), 但这样做效率不是最优的。

 

2、AtomicInteger的实现

主要依靠:1、volatile 保证了变量的可见性,所有线程不缓存volatile变量,需要时都从内存读取,这样能保证所有数据拿到的值都是最新的。

2、compareAndSet(int expect, int update)判断当前值==expect?当前值=update:错误;

这里做了两步操作,判断跟赋值。但因为cpu提供这样指令的支持,所有能保证这个操作时原子的。

 

 

Java代码 复制代码 收藏代码
  1. public class AtomicInteger extends Number implements java.io.Serializable {
  2. private static final long serialVersionUID = 6214790243416807050L;
  3. // setup to use Unsafe.compareAndSwapInt for updates
  4. private static final Unsafe unsafe = Unsafe.getUnsafe();
  5. private static final long valueOffset;
  6. static {
  7. try {
  8. valueOffset = unsafe.objectFieldOffset
  9. (AtomicInteger.class.getDeclaredField("value"));
  10. } catch (Exception ex) { throw new Error(ex); }
  11. }
  12. private volatile int value;
public class AtomicInteger extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 6214790243416807050L;

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
      } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;

 

 

 

3、AtomicInteger 中的set(int newValue) lazySet(int newValue)

void set(int newValue)

设置为给定值。 直接修改原始值,也就是i=newValue操作。

 

void lazySet(int newValue) 最后设置为给定值。

延时设置变量值,这个等价于set()方法,但是由于字段是volatile类型的,因此次字段的修改会比普通字段(非volatile字段)有稍微的性能延时(尽管可以忽略),所以如果不是想立即读取设置的新值,允许在“后台”修改值,那么此方法就很有用。如果还是难以理解,这里就类似于启动一个后台线程如执行修改新值的任务,原线程就不等待修改结果立即返回(这种解释其实是不正确的,但是可以这么理解)。

 

 


 

 

 

 


 

 

4、AtomicInteger中compareAndSet(int expect, int update) weakCompareAndSet(int expect, int update)

 

boolean weakCompareAndSet(int expect, int update)
如果当前值 == 预期值,则以原子方式将该设置为给定的更新值。JSR规范中说:以原子方式读取和有条件地写入变量但 创建任何 happen-before 排序,因此不提供与除weakCompareAndSet 目标外任何变量以前或后续读取或写入操作有关的任何保证。大意就是说调用weakCompareAndSet时并不能保证不存在happen-before的发生(也就是可能存在指令重排序导致此操作失败)。但是从Java源码来看,其实此方法并没有实现JSR规范的要求,最后效果和compareAndSet是等效的,都调用了unsafe.compareAndSwapInt()完成操作。

 

Java代码 复制代码 收藏代码
  1. /**
  2. * Atomically sets the value to the given updated value
  3. * if the current value {@code ==} the expected value.
  4. *
  5. * @param expect the expected value
  6. * @param update the new value
  7. * @return true if successful. False return indicates that
  8. * the actual value was not equal to the expected value.
  9. */
  10. public final boolean compareAndSet(int expect, int update) {
  11. return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
  12. }
  13. /**
  14. * Atomically sets the value to the given updated value
  15. * if the current value {@code ==} the expected value.
  16. *
  17. * <p>May <a href="package-summary.html#Spurious">fail spuriously</a>
  18. * and does not provide ordering guarantees, so is only rarely an
  19. * appropriate alternative to {@code compareAndSet}.
  20. *
  21. * @param expect the expected value
  22. * @param update the new value
  23. * @return true if successful.
  24. */
  25. public final boolean weakCompareAndSet(int expect, int update) {
  26. return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
  27. }
分享到:
评论

相关推荐

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。...java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。

    java.util.concurrent 学习ppt

    6. **Atomic类**:如AtomicInteger、AtomicLong等,提供原子操作,用于在不使用锁的情况下实现线程安全的变量。 通过Java.util.concurrent包,开发者可以更安全、高效地编写并发程序,避免了重复造轮子,同时也降低...

    java.util.concurrent 测试源文件

    5. **原子类**:Atomic包下的类,如AtomicInteger、AtomicLong等,提供了基于CAS(Compare and Swap,比较并交换)操作的无锁编程机制。这些原子变量类在多线程环境中可以进行高效且线程安全的更新。 6. **并发工具...

    atomic-array-rs:定义几种数组类型,其中元素可以原子更新。 旨在提供类似于Java中的java.util.concurrent.atomic中的原子数组类型

    旨在提供类似于Java中的java.util.concurrent.atomic中的原子数组类型。 提供以下类型: AtomicOptionRefArray –对应于 。 AtomicRefArray –具有强制默认值的AtomicOptionRefArray ,用于删除元素的可选属性。...

    Redis客户端Redisson.zip

    of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 java.util.concurrent.atomic.AtomicLong分布式 ...

    javafxHtml编辑器.doc

    ava.util.concurrent.atomic java.util.concurrent.locks java.util.function java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi

    java SE API

    java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.zip javax.accessibility javax.activity javax.crypto javax....

    关于 java.util.concurrent 您不知道的 5 件事,第 2 部分

    5. **原子类(Atomic*)的使用** 原子类如AtomicInteger、AtomicLong和AtomicReference等提供了一种无锁的更新机制,保证了在高并发场景下的数据一致性。它们通过CAS(Compare and Swap)操作实现原子性,避免了...

    28个java常用的工具类

    21. **`java.util.concurrent.atomic.*`**: 原子变量,用于无锁编程。 22. **`java.util.logging.Logger`**: 日志记录工具。 23. **`java.util.concurrent.locks.Lock`** 和 **`java.util.concurrent.locks....

    java线程-Atomic的含义及示例_.docx

    import java.util.concurrent.atomic.AtomicBoolean; public class Test { public static void main(String[] args) throws InterruptedException { Test test = new Test(); test.testAtomicBoolean(); } ...

    java7rt.jar源码-JVM:JVM学习笔记

    java.util.atomic 进程/线程 并发/并行 线程 package com.ntuzy.juc_01 ; import java.util.concurrent.Callable ; import java.util.concurrent.ExecutionException ; import java.util.concurrent.FutureTask ; /*...

    Java多线程:AtomicIntegerArray 原子更新数组类.docx

    import java.util.concurrent.atomic.AtomicIntegerArray; public class Demo { static AtomicIntegerArray atom = new AtomicIntegerArray(new int[]{1, 2, 3, 4, 5}); public static void main(String[] agrs)...

    Javase-6.0_中文API_HTML(最新更新)

    java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax....

    backport-util-concurrent(2.2 /3.1)

    - 虽然Java 5引入了Atomic包,但在backport-util-concurrent中,你可以找到一些基本的原子操作类,如AtomicInteger和AtomicLong,它们提供了无锁的整数和长整型变量操作,提高了并发环境下的性能。 总的来说,...

    30个常用java工具类

    26. **`java.util.concurrent.atomic`** 包:提供原子操作类,用于线程安全的变量更新。 27. **`java.util.function`** 包:函数式接口,如`Predicate`、`Function`和`Supplier`,支持Lambda表达式。 28. **`java....

    jdk 中文版

    java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax....

    java工具类

    24. **`java.util.concurrent.atomic`** 包:包含原子操作类,用于线程安全的变量更新。 25. **`java.util.Calendar`**:旧版的日历类,可以处理复杂的日期和时间计算。 26. **`java.nio.file.Files`** 和 **`java...

    java_util_concurrent_user_guide

    6. **原子类**: `java.util.concurrent.atomic` 包含一系列原子变量类,如`AtomicInteger`、`AtomicLong`、`AtomicReference`等,它们提供了一种无锁编程的方式,支持原子性的读/修改/写操作。 7. **并发工具类**: ...

    JAVA_API1.6文档(中文)

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    大厂面试题第二季(加入了MQ和Mysql的面试题以及答案).mmap

    API中JUC并发的三个相应包和解释1.java.util.concurrent。 concurrent是并发的意思2.java.util.concurrent.atomic。 atomic 是原子性的意思3.java.util.concurrent.locks。 locks是锁的意思

Global site tag (gtag.js) - Google Analytics