����λ�ã���ҳ > �����̳� > �̳� > ѧϰJava��������е�AtomicÔ�ӿ�
һ��д�ڿ�ͷ ��ǰ��IJ���������ѧϰ��volatile�ؼ��֣�֪���������Ա�֤�����ԺͿɼ��ԣ����޷�����Ô���ԣ����Ô���������Ƽ�ʹ��synchronized��Lock����AtomicInteger�����ǻ�ѧϰ��CAS�㷨������ƪ����������ͬ��Ҳ�ἰatomic����ô���죬���Ǿ����ú�ѧһѧAtom
��֮ǰ�IJ����У������Ѿ�ѧϰ��volatile�ؼ��֣��˽⵽�����Ա�֤�����ԺͿɼ��ԣ����޷�����Ô���ԡ����Ô��������ʱ���Ƽ�ʹ��synchronized��Lock����AtomicInteger�����ǻ�ѧϰ��CAS�㷨���ἰ��atomic�����죬���ǽ�����ѧϰAtomicÔ�ӿ⣬����һ������CAS�㷨ʵ�ֵĸ�Ч�������߿⡣
������java.util.concurrent��Ô���඼�����java.util.concurrent.atomic�С�����ͼ��ʾ��
Atomic������Ô�ӡ�����ΪÔ�ӣ��ڻ�ѧ�����Ô�ӱ���Ϊ�ǹ��ɻ�ѧ��Ӧ����С΢�����ӣ��Dz��ɷָ����С��λ��ΰ���Doug Lea��ʦ����������һЩ���Դ˵��ʿ�ͷ������һ���еģ�
���Ǹ��ݲ������������Ϳ��Խ�JUC���е�Ô���������µ�4�ֻ��֣�
Ô�Ӳ����Ļ���������Ҫ�ɷ�Ϊ��
�����ַ�ʽ�÷�������ͬ��������Ô�Ӹ��µķ�ʽ�����������ͣ�������������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��һ�ֳ��õ����������������ڶ��̻߳�����Ô�ӵظ���ֵ��
Ô�Ӳ��������������ͣ����Է�Ϊ���¼��֣�
������ͬ�������ƣ�������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��Ô�����⣬atomic���л��ṩ����������Ô���ࡣ���Ϊ���¼��֣�
���÷�����������������һ�£����ﲻ��׸��������ֱ��дһ��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}
����Ô�Ӹ��¶����������ͣ��⣬atomic�л��ṩ�˸��¶���������ֶε�Ô���ࣺ
�����ҪÔ�ӵĸ��¶�������ԣ�ʵ�����������漸��������΢����һ�£���ŷ�Ϊ������
����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�ꡣ
С���Ƽ��Ķ�ʹ��Blender���ɳ���ģ��
�Ķ�ȫ����������ERA5�����ط���
�Ķ�Xpath���������﷨
�Ķ�����ѧϰ�������繹�����£�
�Ķ���ΪMateƷ��ʢ�䣺HarmonyOS NEXT�ӳ�����Ϸ���ܵõ�����ͷ�
�Ķ�ʵ�ֶ��󼯺���DataTable���໥ת��
�Ķ�Ӳ�̵Ļ���֪ʶ��ѡ��ָ��
�Ķ�������й��ƶ��ı�ͼ��ײ�
�Ķ�����NEXTԪ�����������ѿ����ϼ���Ʒ
�Ķ��ᳲ���С������������Ƽ��رշ���
�Ķ������ArcMap�����н���դ��ͼ���ز�������
�Ķ��㷨�����ݽṹ 1 - ģ��
�Ķ���Ѷ�����߿ͷ���Ӫ��ϵͳ����
�Ķ���Ѷ��Ƶҹ��ģʽ���ý̳�
�Ķ����ں���NEXT��Ѫ���Ŵ���������������
�Ķ�5. Spring Cloud OpenFeign ����ʽ WebService �ͻ��˵ij���ϸʹ��
�Ķ�Java����ģʽ����̬�����Ͷ�̬�����ĶԱȷ���
�Ķ�Win11�ʼDZ����Զ�����Ӧ�õ���ɫ����ʾ����
�Ķ�˼�� V1.5.6 ��׿��
��ս�귨 V7.5.0 ��׿��
У��������������׵������� V1.0 ��׿��
��˸֮�� V1.9.7 ��׿��
������Ե����� v1.0.4 ��׿��
������֮ŠV5.2.3 ��׿��
��������������Դ V1.0 ��׿��
���֮Ϣ V1.0 ��׿��
��ħ������������䣩 V1.0 ��׿��
���ں�������ϵ�����������������վ�����������������Ƽ�����
Ƶ�� ����Ƶ��������ר������������׿�������app����
�Ƽ� ��Ô���������°��������ܿ������ز���
���� ����ɫ������������ ���������ս������������
ɨ��ά�����������ֻ��汾��
ɨ��ά����������΢�Ź��ںţ�
��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]
��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������