Java 原子性引用 AtomicReference

來源:互聯網
上載者:User

標籤:ati   tps   []   操作   object   turn   ica   exce   code   

連結:https://www.jianshu.com/p/882d0e2c3ea6 來源:簡書  專職跑龍套AtomicReference

An object reference that may be updated atomically.

The AtomicReference class provides reference objects that may be read and written atomically, so when multiple threads try to reach them at the same time, only one will be able to do so.
提供了引用變數的讀寫原子性操作。

提供了如下的方法:

  • compareAndSet(V expect, V update):Atomically sets the value to the given updated value if the current value == the expected value.
  • getAndSet(V newValue):Atomically sets to the given value and returns the old value.
  • lazySet(V newValue):Eventually sets to the given value.
  • set(V newValue):Sets to the given value.
  • get():Gets the current value.

假設有一個類 Person,定義如下:

class Person {    private String name;    private int age;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String toString() {        return "[name: " + this.name + ", age: " + this.age + "]";    }}

如果使用普通的對象引用,在多線程情況下進行對象的更新可能會導致不一致性。例如:
一個對象的初始狀態為 name=Tom, age = 18
在 線程1 中將 name 修改為 Tom1age + 1
在 線程2 中將 name 修改為 Tom2age + 2

我們認為只會產生兩種結果:

  • 若 線程1 先執行,線程2 後執行,則中間狀態為 name=Tom1, age = 19,結果狀態為 name=Tom2, age = 21
  • 若 線程2 先執行,線程1 後執行,則中間狀態為 name=Tom2, age = 20,結果狀態為 name=Tom1, age = 21

但是可能的輸出如下:

Person is [name: Tom, age: 18]
Thread2 Values [name: Tom1, age: 21]
Thread1 Values [name: Tom1, age: 21]
Now Person is [name: Tom1, age: 21]

// 普通引用private static Person person;public static void main(String[] args) throws InterruptedException {    person = new Person("Tom", 18);    System.out.println("Person is " + person.toString());    Thread t1 = new Thread(new Task1());    Thread t2 = new Thread(new Task2());    t1.start();    t2.start();    t1.join();    t2.join();    System.out.println("Now Person is " + person.toString());}static class Task1 implements Runnable {    public void run() {        person.setAge(person.getAge() + 1);        person.setName("Tom1");        System.out.println("Thread1 Values "                + person.toString());    }}static class Task2 implements Runnable {    public void run() {        person.setAge(person.getAge() + 2);        person.setName("Tom2");        System.out.println("Thread2 Values "                + person.toString());    }}

如果使用原子性對象引用,在多線程情況下進行對象的更新可以確保一致性。例如:

// 普通引用private static Person person;// 原子性引用private static AtomicReference<Person> aRperson;public static void main(String[] args) throws InterruptedException {    person = new Person("Tom", 18);    aRperson = new AtomicReference<Person>(person);    System.out.println("Atomic Person is " + aRperson.get().toString());    Thread t1 = new Thread(new Task1());    Thread t2 = new Thread(new Task2());    t1.start();    t2.start();    t1.join();    t2.join();    System.out.println("Now Atomic Person is " + aRperson.get().toString());}static class Task1 implements Runnable {    public void run() {        aRperson.getAndSet(new Person("Tom1", aRperson.get().getAge() + 1));        System.out.println("Thread1 Atomic References "                + aRperson.get().toString());    }}static class Task2 implements Runnable {    public void run() {        aRperson.getAndSet(new Person("Tom2", aRperson.get().getAge() + 2));        System.out.println("Thread2 Atomic References "                + aRperson.get().toString());    }}

但是可能的輸出如下:

Atomic Person is [name: Tom, age: 18]
Thread1 Atomic References [name: Tom1, age: 19]
Thread2 Atomic References [name: Tom2, age: 21]
Now Atomic Person is [name: Tom2, age: 21]

引用:
Java AtomicReference Example

(轉)Java 原子性引用 AtomicReference

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.