【JUC】03-原子變量

一、介紹

1、類的小工具包,支持在單個變量上解除鎖的線程安全編程。此包中的類可 將 volatile 值、字段和數組元素的概念擴展到那些也提供原子條件更新操作的類。

import java.util.concurrent.atomic

2、類 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的實例各自提供對 相應類型單個變量的訪問和更新。每個類也爲該類型提供適當的實用工具方法。

3、AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray類進一步擴展了原子操 作,對這些類型的數組提供了支持。

4、 核心方法:boolean compareAndSet(expectedValue, updateValue)

5、java.util.concurrent.atomic包下提供了一些原子操作的常用類:

  1. AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference
  1. AtomicIntegerArray、AtomicLongArray
  1. AtomicMarkableReference
  1. AtomicReferenceArray
  1. AtomicStampedReference

二、代碼案例

package com.example.juc;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;


/**
 * @author haoxiansheng
 * i++ 的原子性問題 => 底層 分爲 讀-改=寫
 *
 */
public class AtomicDemoTest {

    public static void main(String[] args) {

        // 產生多線程問題
        AtomicDemo atomic = new AtomicDemo();
        for (int i = 0; i < 10; i++) {
            new Thread(atomic).start();
        }
    }
}

@Slf4j
class AtomicDemo implements Runnable {
    // private int serialNumber = 0;
    private AtomicInteger serialNumber = new AtomicInteger();

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("=>{},serialNumber=>{}", Thread.currentThread().getName(), getSerialNumber());
    }

    public int getSerialNumber() {
        //return serialNumber++;
        return serialNumber.getAndIncrement();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章