【基础知识】多线程

版权声明:转载请注明出处 https://blog.csdn.net/qq_38537286/article/details/85245045
  1. 点击查看例子详情
  2. 原子性操作概念
    原子性操作 即为不可中断的操作,比如赋值 int i=5; 原子操作本身是线程安全的,但是i++是由3个步骤实现(取i值,i+1,新值赋予i),不是原子操作。 
  3. 原子类
    JDK6以后新增包java.util.concurrent.atomic,里面有各种原子类,比如AtomicInteger,AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。
    AtomicBoolean:原子更新布尔类型;
    AtomicInteger:原子更新整型;
    AtomicLong:原子更新长整型。
  4. 常用方法
    int getAndIncrement() 自增,返回旧值(即加1前的原始值);
    decrementAndGet() 自减,返回新值(即减1后的值);
    incrementAndGet() 自增,返回新值(即加1后的值);
    int addAndGet(int delta) :以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果;
    boolean compareAndSet(int expect, int update) :如果输入的数值等于预期值,则以原子方式将该值设置为输入的值;
    void lazySet(int newValue):最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
  5. 原子更新数组类:通过原子的方式更新数组里的某个元素
    AtomicIntegerArray:原子更新整型数组里的元素;
    AtomicLongArray:原子更新长整型数组里的元素;
    AtomicReferenceArray:原子更新引用类型数组里的元素。
    AtomicIntegerArray类常用方法:
    int addAndGet(int i, int delta):以原子方式将输入值与数组中索引i的元素相加。
    boolean compareAndSet(int i, int expect, int update):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值
  6. 原子更新数组类:原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类
    AtomicReference:原子更新引用类型。
    AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
    AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子的更新一个布尔类型的标记位和引用类型。构造方法是AtomicMarkableReference(V initialRef, boolean initialMark)
  7. 原子更新字段类
    AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
    AtomicLongFieldUpdater:原子更新长整型字段的更新器。
    AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号,可以解决使用CAS进行原子更新时,可能出现的ABA问题。
  8. 原子更新字段类都是抽象类,每次使用都时候必须使用静态方法newUpdater创建一个更新器。原子更新类的字段的必须使用public volatile修饰符。

猜你喜欢

转载自blog.csdn.net/qq_38537286/article/details/85245045