����λ�ã���ҳ > �����̳� > �̳� > ѧϰJava��������е�Atomicԭ�ӿ�

ѧϰJava��������е�Atomicԭ�ӿ�

��Դ������������|��ʱ�䣺2024-05-21 09:46:03 |���Ķ���137��|�� ��ǩ�� T MIC VA Ato AVA v S C �㷨 ��� AV java �� |����������

һ��д�ڿ�ͷ ��ǰ��IJ���������ѧϰ��volatile�ؼ��֣�֪���������Ա�֤�����ԺͿɼ��ԣ����޷�����ԭ���ԣ����ԭ���������Ƽ�ʹ��synchronized��Lock����AtomicInteger�����ǻ�ѧϰ��CAS�㷨������ƪ����������ͬ��Ҳ�ἰatomic����ô���죬���Ǿ����ú�ѧһѧAtom

��֮ǰ�IJ����У������Ѿ�ѧϰ��volatile�ؼ��֣��˽⵽�����Ա�֤�����ԺͿɼ��ԣ����޷�����ԭ���ԡ����ԭ��������ʱ���Ƽ�ʹ��synchronized��Lock����AtomicInteger�����ǻ�ѧϰ��CAS�㷨���ἰ��atomic�����죬���ǽ�����ѧϰAtomicԭ�ӿ⣬����һ������CAS�㷨ʵ�ֵĸ�Ч�������߿⡣

������java.util.concurrent��ԭ���඼�����java.util.concurrent.atomic�С�����ͼ��ʾ��

ѧϰJava²¢·¢±à³ÌÖеÄAtomicÔ­×Ó¿â

һ��Atomic����

Atomic����Ϊ��ԭ�ӡ�����Ϊԭ�ӣ��ڻ�ѧ�����ԭ�ӱ���Ϊ�ǹ��ɻ�ѧ��Ӧ����С΢�����ӣ��Dz��ɷָ����С��λ��ΰ���Doug Lea��ʦ����������һЩ���Դ˵��ʿ�ͷ������һ���еģ�

  • ԭ�����ڳ��������������˼�ǣ�һ�����߶��������CPUִ�еĹ����в����жϵ����ԡ�
  • ԭ�Ӳ����ڳ����б������˼�ǣ�����С���ɲ�ֵIJ�����Ҳ����˵����һ����ʼ���Ͳ��ܱ���ϣ�ֱ��������ɡ�

�����Ĵ�ԭ�ӷ���

���Ǹ��ݲ������������Ϳ��Խ�JUC���е�ԭ���������µ�4�ֻ��֣�

2.1 ��������

ԭ�Ӳ����Ļ���������Ҫ�ɷ�Ϊ��

  1. AtomicBoolean��������ԭ���ࣻ
  2. AtomicInteger������ԭ���ࣻ
  3. AtomicLong��������ԭ���ࣻ

�����ַ�ʽ�÷�������ͬ��������ԭ�Ӹ��µķ�ʽ�����������ͣ�������������AtomicIntegerΪ����һ������ʹ����ԭ����

1��AtomicInteger�ij��÷���

public final int get() //��ȡ��ǰ��ֵ
public final int getAndSet(int newValue)//��ȡ��ǰ��ֵ��������ΪnewValue
public final int getAndIncrement()//��ȡ��ǰ��ֵ��������
public final int incrementAndGet()//���� 1������ȡ��ֵ,ע�������淽������
public final int getAndDecrement() //��ȡ��ǰ��ֵ�����Լ�
public final int getAndAdd(int delta) //��ȡ��ǰ��ֵ��������Ԥ�ڵ�ֵdelta
boolean compareAndSet(int expect, int update) //����������ֵ����Ԥ��ֵ������ԭ�ӷ�ʽ����ֵ����Ϊ����ֵ��update��
public final void lazySet(int newValue)//��������ΪnewValue,ʹ�� lazySet ����֮����ܵ��������߳���֮���һС��ʱ���ڻ��ǿ��Զ����ɵ�ֵ.

2��AtomicInteger��ʹ�ð���

public class Test {
    public static void main(String[] args) {
        //��ʱֵ
        int temvalue = 0;
        AtomicInteger i = new AtomicInteger(0);
        temvalue = i.getAndSet(3);
        System.out.println("temvalue:" + temvalue + ";  i:" + i); //temvalue:0;  i:3
        temvalue = i.getAndIncrement();
        System.out.println("temvalue:" + temvalue + ";  i:" + i); //temvalue:3;  i:4
        temvalue = i.getAndAdd(5);
        System.out.println("temvalue:" + temvalue + ";  i:" + i); //temvalue:4;  i:9
        temvalue = i.incrementAndGet();
        System.out.println("temvalue:" + temvalue + ";  i:" + i); //temvalue:10;  i:10
    }
}

������Ҫע���һ����getAndIncrement()������incrementAndGet()��һ���Ȼ�ֵ��������һ�����������ֵ��

3��AtomicInteger�ĵײ�ԭ��

������getAndIncrement()Ϊ����ȥ�������ĵײ����ᷢ�֣����ڲ���ͨ������UnSafe��ľ�̬����getUnsafeʵ�ֵġ�UnSafe����CAS�㷨��ʱ�����ἰ�����������ٵ���ѧϰ������ײ���ͨ��CAS��ԭ���ԵĽ�������ֵ��

public final int getAndIncrement() {
    // ʹ��Unsafe���е�getAndAddInt����ԭ�ӵ�����AtomicInteger�ĵ�ǰֵ
    // ��һ������this��AtomicInteger�ĵ�ǰʵ��
    // �ڶ�������valueOffset��һ��ƫ��������ָʾ��AtomicInteger�����е��ĸ�λ�ÿ����ҵ�ʵ�ʵ�intֵ
    // ����������1��ʾҪ�ӵ���ǰֵ�ϵ�ֵ�������ӵ�ֵ��
    // �˷������ص�������ǰ��ԭʼֵ
    return unsafe.getAndAddInt(this, valueOffset, 1);
}

Unsafe ����Java�е�һ�������࣬����ִ�еͼ�������ȫ�IJ�����getAndIncrement��������������Unsafe���ṩ��CAS��Compare-And-Swap��������ʵ��ԭ�ӵ�increment������CAS��һ�ֳ��õ����������������ڶ��̻߳�����ԭ�ӵظ���ֵ��

2.2 ��������

ԭ�Ӳ��������������ͣ����Է�Ϊ���¼��֣�

  1. AtomicIntegerArray����������ԭ����
  2. AtomicLongArray������������ԭ����
  3. AtomicReferenceArray��������������ԭ����

������ͬ�������ƣ�������AtomicIntegerArrayΪ��������һ�¡�

1��AtomicIntegerArray�ij��÷���

public final int get(int i) //��ȡ index=i λ��Ԫ�ص�ֵ
public final int getAndSet(int i, int newValue)//���� index=i λ�õĵ�ǰ��ֵ������������Ϊ��ֵ��newValue
public final int getAndIncrement(int i)//��ȡ index=i λ��Ԫ�ص�ֵ�����ø�λ�õ�Ԫ������
public final int getAndDecrement(int i) //��ȡ index=i λ��Ԫ�ص�ֵ�����ø�λ�õ�Ԫ���Լ�
public final int getAndAdd(int i, int delta) //��ȡ index=i λ��Ԫ�ص�ֵ��������Ԥ�ڵ�ֵ
boolean compareAndSet(int i, int expect, int update) //����������ֵ����Ԥ��ֵ������ԭ�ӷ�ʽ�� index=i λ�õ�Ԫ��ֵ����Ϊ����ֵ��update��
public final void lazySet(int i, int newValue)//���� ��index=i λ�õ�Ԫ������ΪnewValue,ʹ�� lazySet ����֮����ܵ��������߳���֮���һС��ʱ���ڻ��ǿ��Զ����ɵ�ֵ.

2��AtomicIntegerArray��ʹ�ð���

public class Test {
    public static void main(String[] args) {
        int temvalue = 0;
        int[] nums = { 1, 2, 3, 4, 5, 6 };
        AtomicIntegerArray i = new AtomicIntegerArray(nums);
        for (int j = 0; j < nums.length; j++) {
            System.out.print(i.get(j));
        }
        System.out.println();
        temvalue = i.getAndSet(0, 2);
        System.out.println("temvalue:" + temvalue + ";  i:" + i);
        temvalue = i.getAndIncrement(0);
        System.out.println("temvalue:" + temvalue + ";  i:" + i);
        temvalue = i.getAndAdd(0, 5);
        System.out.println("temvalue:" + temvalue + ";  i:" + i);
    }
}

�����

123456
temvalue:1;  i:[2, 2, 3, 4, 5, 6]
temvalue:2;  i:[3, 2, 3, 4, 5, 6]
temvalue:3;  i:[8, 2, 3, 4, 5, 6]

2.3 ��������

�������ϵ�2��ԭ�����⣬atomic���л��ṩ����������ԭ���ࡣ���Ϊ���¼��֣�

  1. AtomicReference��ԭ�Ӹ����������ͣ�ʹ��AtomicReference�ౣ֤����֮���ԭ���ԣ��Ѷ�������ŵ�һ�������������CAS������
  2. AtomicStampedReference��ԭ�Ӹ��´��а汾�ŵ��������͡����ཫ����ֵ�����ù��������������ڽ��ԭ�ӵĸ������ݺ����ݵİ汾�ţ����Խ��ʹ��CAS����ԭ�Ӹ���ʱ���ܳ��ֵ�ABA���⣻
  3. AtomicMarkableReference��ԭ�Ӹ��´��б�ǵ��������ͣ����ཫboolean��������ù���������

���÷�����������������һ�£����ﲻ��׸��������ֱ��дһ��demo����һ������ʹ�ðɡ�

public class TestAtomicReference {

    private static AtomicReference reference = new AtomicReference<>();

    public static void main(String[] args) {
        User user1 = new User("��", 18);
        reference.set(user1);
        User user2 = new User("��",20);
        User user = reference.getAndSet(user2);
        System.out.println(user);
        System.out.println(reference.get());
    }

    static class User {
        private String userName;
        private int age;

        public User(String userName, int age) {
            this.userName = userName;
            this.age = age;
        }

        @Override
        public String toString() {
            return "User{" +
                    "userName='" + userName + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

�����

User{userName='��', age=18}
User{userName='��', age=20}

2.4 ����������޸�����

����ԭ�Ӹ��¶����������ͣ��⣬atomic�л��ṩ�˸��¶���������ֶε�ԭ���ࣺ

  1. AtomicIntegerFieldUpdater:ԭ�Ӹ��������ֶεĸ�������
  2. AtomicLongFieldUpdater��ԭ�Ӹ��³������ֶεĸ�������
  3. AtomicReferenceFieldUpdater��ԭ�Ӹ���������������ֶεĸ�������

�����Ҫԭ�ӵĸ��¶�������ԣ�ʵ�����������漸��������΢����һ�£���ŷ�Ϊ������

����1??
ͨ����̬����newUpdater����һ��������������������Ҫ���µ�����ֶΣ�

����2??
�ֶα���ʹ��public volatile�������Σ�

��AtomicIntegerFieldUpdaterΪ��������дһ�����������һ�¡�

public class TestAtomicIntegerFieldUpdater {
    //����һ��age�ĸ�����
    private static AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(User.class,"age");

    public static void main(String[] args) {
        User user = new User("��", 17);
        int oldValue = updater.getAndAdd(user, 1);
        System.out.println(oldValue);//17
        System.out.println(updater.get(user));//18
    }

    static class User {
        private String userName;
        public volatile int age;

        public User(String userName, int age) {
            this.userName = userName;
            this.age = age;
        }

        @Override
        public String toString() {
            return "User{" +
                    "userName='" + userName + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

ͨ��AtomicIntegerFieldUpdater.newUpdater(User.class,"age")����һ��age�ĸ�������Ȼ�����getAndAdd(user, 1)���������1��������17���Ϊ18�ꡣ

С���Ƽ��Ķ�

�������������Ľ�Ϊ������Ϣ����������������ͬ���޹۵��֤ʵ��������

�����Ƶ����

����

ͬ������

����

ɨ��ά�����������ֻ��汾��

ɨ��ά����������΢�Ź��ںţ�

��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]

��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������