看完后,你再也不用怕面试问并发编程啦(11)

方法含义int addAndGet(int delta)以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果boolean compareAndSet(int expect,int update)如果输入的数值等于预期值,则以原子方式将该值设置为输入的值int getAndIncrement()以原子方式将当前值加1,注意 , 这里返回的是自增前的值void lazySet(int newValue)最终会设置成newValue , 使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值int getAndSet(int newValue)以原子方式设置为newValue的值,并返回旧值 。int incrementAndGet()以原子方式将当前值加1,注意,这里返回的是自增后的值 代码:package cn.itcast.thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;public class Test12 implements Runnable { // 定义整型并发原子对象 private static AtomicInteger atomicInteger = new AtomicInteger(0); @Override public void run() { try { // 线程休眠 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } // 进行原子性操作+1 System.out.println(atomicInteger.incrementAndGet()); } public static void main(String[] args) throws InterruptedException { // 创建List集合 List<Thread> list = new ArrayList<>(); Test12 task = new Test12(); // 开启多线程进行操作共享变量 for (int i = 0; i <10 ; i++) { Thread thread = new Thread(task); list.add(thread); thread.start(); } for (Thread thread : list) { thread.join(); // 确保所有thread全部运行 } System.out.println("递增结果:" + atomicInteger.get()); }} 运行效果

看完后,你再也不用怕面试问并发编程啦

文章插图

 15、原子更新数组类型目标:掌握java.util.concurrent.atomic包下原子更新数组类型
介绍
通过原子的方式更新数组里的某个元素,Atomic包提供了以下3个类 。这几个类提供的方法几乎一样,所以本节仅以AtomicIntegerArray为例进行讲解 。 类含义AtomicIntegerArray原子更新整型数组里的元素AtomicLongArray原子更新长整型数组里的元素AtomicReferenceArray原子更新引用类型数组里的元素 AtomicIntegerArray类: 方法含义int addAndGet(int i,int delta)以原子方式将输入值与数组中索引i的元素相加boolean compareAndSet(int i,int expect,int update)如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值 代码:package cn.itcast.thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicIntegerArray;public class Test13 implements Runnable{ // 定义数组 private static int[] ints = {0,2,3}; // 定义原子整型数组对象 private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(ints); @Override public void run() { try { // 线程休眠 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } // 操作普通数组中的第一个元素 +1 ints[0] = ints[0] + 1; // 操作原子数组中的第一个元素 +1 System.out.println(atomicIntegerArray.incrementAndGet(0)); } public static void main(String[] args) throws InterruptedException { // 创建List集合 List<Thread> list = new ArrayList<>(); Test13 task = new Test13(); // 开启多线程进行操作共享变量 for (int i = 0; i <10 ; i++) { Thread thread = new Thread(task); list.add(thread); thread.start(); } for (Thread thread : list) { thread.join(); // 确保所有thread全部运行 } System.out.println("原子数组操作结果:" + atomicIntegerArray.get(0)); // 10 System.out.println("普通数组操作结果:" + ints[0]); // 不一定 }} 运行效果
看完后,你再也不用怕面试问并发编程啦

文章插图
注意:
数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时 , 不会影响传入的数组 。16、原子更新引用类型目标:使用原子操作更新引用类型数据(也就是原子更新多个变量)
介绍
原子更新基本类型的AtomicInteger , 只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类 。Atomic包提供了以下3个类: 类介绍AtomicReference原子更新引用类型AtomicReferenceFieldUpdater原子更新引用类型里的字段AtomicMarkableReference原子更新带有标记位的引用类型 。可以原子更新一个布尔类型的标记位和引用类型 。构造方法AtomicMarkableReference(V initialRef,boolean initialMark) AtomicReference类:


推荐阅读