JDK 8 AtomicBoolean 源码详解(详细注释版)

JDK 8 AtomicBoolean 源码详解(详细注释版)

1. 类定义和基本属性

public class AtomicBoolean implements java.io.Serializable {
    
    // 序列化版本号
    private static final long serialVersionUID = 4654671469794556979L;

    /**
     * Unsafe类实例,提供底层的原子操作
     * 通过Unsafe可以直接操作内存地址,实现CAS等原子操作
     */
    private static final sun.misc.Unsafe unsafe = getUnsafe();

    /**
     * value字段在对象中的偏移量
     * 通过这个偏移量可以使用Unsafe直接操作value字段的内存地址
     * 这是实现原子操作的关键
     */
    private static final long valueOffset;

    /**
     * 静态初始化块,获取value字段的偏移量
     * 在类加载时执行,确保偏移量的正确性
     */
    static {
        try {
            // 获取value字段的偏移量
            valueOffset = unsafe.objectFieldOffset
                (AtomicBoolean.class.getDeclaredField("value"));
        } catch (Exception ex) { 
            throw new Error(ex); 
        }
    }

    /**
     * 获取Unsafe实例的方法
     * 由于Unsafe类的特殊性,需要通过反射获取实例
     * @return Unsafe实例
     */
    private static sun.misc.Unsafe getUnsafe() {
        try {
            return sun.misc.Unsafe.getUnsafe();
        } catch (SecurityException se) {
            try {
                return java.security.AccessController.doPrivileged
                    (new java.security.PrivilegedExceptionAction<sun.misc.Unsafe>() {
                        public sun.misc.Unsafe run() throws Exception {
                            Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
                            for (java.lang.reflect.Field f : k.getDeclaredFields()) {
                                f.setAccessible(true);
                                Object x = f.get(null);
                                if (k.isInstance(x))
                                    return k.cast(x);
                            }
                            throw new NoSuchFieldError("the Unsafe");
                        }});
            } catch (java.security.PrivilegedActionException e) {
                throw new RuntimeException("Could not initialize intrinsics",
                                           e.getCause());
            }
        }
    }

    /**
     * 实际存储的int值(不是boolean)
     * 使用volatile修饰确保内存可见性
     * 使用int而不是boolean是为了与Unsafe的操作兼容
     * 1表示true,0表示false
     */
    private volatile int value;

    /**
     * 默认构造方法
     * 创建一个初始值为false的AtomicBoolean
     * 
     * 初始化过程:
     * 1. value字段被初始化为0(int的默认值,表示false)
     * 2. volatile语义确保对其他线程的可见性
     */
    public AtomicBoolean() {
    }

    /**
     * 指定初始值的构造方法
     * @param initialValue 初始值
     * 
     * 初始化过程:
     * 1. value字段被设置为初始值对应的int值(true为1,false为0)
     * 2. volatile语义确保对其他线程的可见性
     */
    public AtomicBoolean(boolean initialValue) {
        value = initialValue ? 1 : 0;
    }

    /**
     * 获取当前值
     * 将int值转换为boolean值返回
     * 由于value字段是volatile的,这个方法保证返回最新的值
     * 
     * 时间复杂度:O(1)
     * 线程安全性:完全线程安全
     * 
     * @return 当前boolean值
     */
    public final boolean get() {
        return value != 0;
    }

    /**
     * 设置新值
     * 这个操作不是原子的,只是简单地设置新值
     * 
     * 注意事项:
     * - 这个方法不保证原子性
     * - 如果需要原子性设置,应该使用compareAndSet方法
     * - volatile语义确保新值对其他线程可见
     * 
     * @param newValue 新值
     */
    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }

    /**
     * 最终设置新值
     * 这个方法确保在方法返回之前,新值对其他线程可见
     * 
     * 与set方法的区别:
     * - lazySet可能延迟设置,提高性能
     * - setImmediately确保立即设置
     * 
     * @param newValue 新值
     */
    public final void lazySet(boolean newValue) {
        unsafe.putOrderedInt(this, valueOffset, newValue ? 1 : 0);
    }

    /**
     * 原子地设置新值并返回旧值
     * 这是一个原子操作,保证读取和设置的原子性
     * 
     * 操作过程:
     * 1. 读取当前值
     * 2. 设置新值
     * 3. 返回旧值
     * 
     * 时间复杂度:O(1)
     * 线程安全性:完全原子性
     * 
     * @param newValue 新值
     * @return 旧值
     */
    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));
        return prev;
    }

    /**
     * 原子地比较并设置值
     * 只有当当前值等于期望值时,才设置为新值
     * 
     * 操作过程:
     * 1. 比较当前值和期望值
     * 2. 如果相等,将当前值设置为新值
     * 3. 返回比较结果
     * 
     * CAS操作特点:
     * - 无锁操作,性能优秀
     * - 乐观锁机制,避免阻塞
     * - 对于boolean类型,ABA问题不会出现
     * 
     * 时间复杂度:O(1)
     * 线程安全性:完全原子性
     * 
     * @param expect 期望值
     * @param update 新值
     * @return 如果设置成功返回true,否则返回false
     */
    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

    /**
     * 弱原子地比较并设置值
     * 与compareAndSet类似,但在某些平台上可能不提供完全的内存排序保证
     * 
     * 使用场景:
     * - 对内存排序要求不严格的场景
     * - 性能要求极高的场景
     * 
     * @param expect 期望值
     * @param update 新值
     * @return 如果设置成功返回true,否则返回false
     */
    public final boolean weakCompareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

2. 逻辑操作方法(详细注释)

    /**
     * 原子地进行逻辑与操作并返回旧值
     * 将当前值与给定值进行逻辑与操作
     * 
     * 操作过程:
     * 1. 获取当前值
     * 2. 计算逻辑与结果
     * 3. 使用CAS操作更新值
     * 4. 如果CAS失败,重复步骤1-3
     * 5. 返回旧值
     * 
     * 时间复杂度:O(1) 平均情况,O(∞) 最坏情况(高竞争)
     * 线程安全性:完全原子性
     * 
     * @param x 要进行逻辑与操作的值
     * @return 操作前的值
     */
    public final boolean getAndSet(boolean x) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, x));
        return prev;
    }

    /**
     * 原子地进行逻辑与操作并返回新值
     * 将当前值与给定值进行逻辑与操作
     * 
     * 操作过程:
     * 1. 获取当前值
     * 2. 计算逻辑与结果
     * 3. 使用CAS操作更新值
     * 4. 如果CAS失败,重复步骤1-3
     * 5. 返回新值
     * 
     * 时间复杂度:O(1) 平均情况,O(∞) 最坏情况(高竞争)
     * 线程安全性:完全原子性
     * 
     * @param x 要进行逻辑与操作的值
     * @return 操作后的值
     */
    public final boolean andAndGet(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev & x;
        } while (!compareAndSet(prev, next));
        return next;
    }

    /**
     * 原子地进行逻辑或操作并返回新值
     * 将当前值与给定值进行逻辑或操作
     * 
     * 操作过程:
     * 1. 获取当前值
     * 2. 计算逻辑或结果
     * 3. 使用CAS操作更新值
     * 4. 如果CAS失败,重复步骤1-3
     * 5. 返回新值
     * 
     * 时间复杂度:O(1) 平均情况,O(∞) 最坏情况(高竞争)
     * 线程安全性:完全原子性
     * 
     * @param x 要进行逻辑或操作的值
     * @return 操作后的值
     */
    public final boolean orAndGet(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev | x;
        } while (!compareAndSet(prev, next));
        return next;
    }

    /**
     * 原子地进行逻辑异或操作并返回新值
     * 将当前值与给定值进行逻辑异或操作
     * 
     * 操作过程:
     * 1. 获取当前值
     * 2. 计算逻辑异或结果
     * 3. 使用CAS操作更新值
     * 4. 如果CAS失败,重复步骤1-3
     * 5. 返回新值
     * 
     * 时间复杂度:O(1) 平均情况,O(∞) 最坏情况(高竞争)
     * 线程安全性:完全原子性
     * 
     * @param x 要进行逻辑异或操作的值
     * @return 操作后的值
     */
    public final boolean xorAndGet(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev ^ x;
        } while (!compareAndSet(prev, next));
        return next;
    }

    /**
     * 原子地进行逻辑与操作并返回旧值
     * 
     * @param x 要进行逻辑与操作的值
     * @return 操作前的值
     */
    public final boolean getAndAnd(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev & x;
        } while (!compareAndSet(prev, next));
        return prev;
    }

    /**
     * 原子地进行逻辑或操作并返回旧值
     * 
     * @param x 要进行逻辑或操作的值
     * @return 操作前的值
     */
    public final boolean getAndOr(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev | x;
        } while (!compareAndSet(prev, next));
        return prev;
    }

    /**
     * 原子地进行逻辑异或操作并返回旧值
     * 
     * @param x 要进行逻辑异或操作的值
     * @return 操作前的值
     */
    public final boolean getAndXor(boolean x) {
        boolean prev, next;
        do {
            prev = get();
            next = prev ^ x;
        } while (!compareAndSet(prev, next));
        return prev;
    }

3. 字符串表示方法(详细注释)

    /**
     * 返回对象的字符串表示
     * 重写Object类的toString方法
     * 
     * @return 当前值的字符串表示
     */
    public String toString() {
        return Boolean.toString(get());
    }

    /**
     * 计算当前值的哈希码
     * 重写Object类的hashCode方法
     * 
     * @return 当前值的哈希码
     */
    public int hashCode() {
        return Boolean.hashCode(get());
    }

    /**
     * 比较两个AtomicBoolean对象是否相等
     * 重写Object类的equals方法
     * 
     * @param obj 要比较的对象
     * @return 如果相等返回true,否则返回false
     */
    public boolean equals(Object obj) {
        if (obj instanceof AtomicBoolean) {
            return get() == ((AtomicBoolean)obj).get();
        }
        return false;
    }

4. AtomicBoolean 的特点分析

核心设计理念:

/**
 * AtomicBoolean的核心设计思想:
 * 
 * 1. 无锁编程:
 *    - 使用CAS(Compare-And-Swap)操作实现原子性
 *    - 避免传统锁的开销和阻塞
 *    - 提供乐观锁机制
 * 
 * 2. volatile语义:
 *    - value字段使用volatile修饰(存储为int)
 *    - 保证内存可见性
 *    - 确保读操作获取最新值
 * 
 * 3. Unsafe支持:
 *    - 使用sun.misc.Unsafe类提供底层原子操作
 *    - 直接操作内存地址,性能优异
 *    - 绕过JVM的常规访问控制
 * 
 * 4. 偏移量机制:
 *    - 通过字段偏移量直接访问内存
 *    - 避免反射开销
 *    - 提供精确的内存操作
 * 
 * 5. 自旋重试:
 *    - CAS失败时自动重试
 *    - 保证操作的最终成功
 *    - 适用于竞争不激烈的场景
 * 
 * 6. 类型优化:
 *    - 内部使用int存储boolean值(1表示true,0表示false)
 *    - 与Unsafe的int操作兼容
 *    - 避免boolean到int的频繁转换
 * 
 * 7. 逻辑操作支持:
 *    - 提供与、或、异或等逻辑操作
 *    - 支持原子的位运算
 *    - 适用于标志位的复合操作
 * 
 * 适用场景:
 * - 状态标志管理
 * - 开关控制
 * - 线程间简单的布尔值通信
 * - 需要原子操作的布尔值计算
 * - 高并发环境下的状态同步
 */

性能特征分析:

/**
 * AtomicBoolean的性能特征:
 * 
 * 时间复杂度:
 * - get(): O(1) - 直接读取volatile字段
 * - set(): O(1) - 直接写入volatile字段
 * - compareAndSet(): O(1) 平均,O(∞) 最坏
 * - 逻辑操作: O(1) 平均,O(∞) 最坏
 * 
 * 空间复杂度:
 * - O(1) - 只需要存储一个int值和偏移量
 * 
 * 并发特性:
 * - 完全线程安全
 * - 无锁设计,避免线程阻塞
 * - 乐观锁机制,适用于低竞争场景
 * - 高竞争场景下可能出现自旋开销
 * 
 * 与synchronized对比:
 * - 无竞争:AtomicBoolean > synchronized
 * - 低竞争:AtomicBoolean > synchronized
 * - 高竞争:AtomicBoolean可能 < synchronized
 * - 内存开销:AtomicBoolean < synchronized
 * 
 * 与AtomicInteger/AtomicLong对比:
 * - 功能相似:都提供原子操作
 * - 内存使用:AtomicBoolean ≈ AtomicInteger < AtomicLong
 * - 性能:AtomicBoolean ≥ AtomicInteger ≥ AtomicLong
 * - 适用场景:AtomicBoolean专门用于布尔值操作
 * 
 * CAS操作特点:
 * - 乐观锁:假设没有冲突,冲突时重试
 * - 非阻塞:不会阻塞其他线程
 * - ABA问题:对于boolean类型不会出现
 * - 自旋开销:高竞争时CPU使用率可能较高
 * 
 * 内存使用:
 * - 每个实例固定开销很小
 * - volatile字段保证可见性
 * - 及时GC,避免内存泄漏
 * 
 * 适用性:
 * - 布尔值原子操作:性能优异
 * - 状态标志管理:性能优异
 * - 简单同步逻辑:比锁更灵活
 * - 复杂同步逻辑:可能不如锁机制
 */

5. 使用示例和最佳实践

/**
 * 使用示例:
 * 
 * // 基本使用
 * AtomicBoolean flag = new AtomicBoolean(false);
 * 
 * // 获取和设置值
 * boolean currentValue = flag.get();
 * flag.set(true);
 * 
 * // 比较并设置
 * boolean success = flag.compareAndSet(false, true);
 * if (success) {
 *     System.out.println("Flag updated successfully");
 * } else {
 *     System.out.println("Flag update failed");
 * }
 * 
 * // 原子地设置新值并返回旧值
 * boolean oldValue = flag.getAndSet(true);
 * 
 * // 逻辑操作
 * AtomicBoolean status = new AtomicBoolean(true);
 * 
 * // 逻辑与操作
 * boolean andResult = status.andAndGet(false); // 结果为false
 * 
 * // 逻辑或操作
 * boolean orResult = status.orAndGet(true); // 结果为true
 * 
 * // 逻辑异或操作
 * boolean xorResult = status.xorAndGet(true); // 结果为false
 * 
 * // 线程间状态同步示例
 * class ThreadSafeFlag {
 *     private final AtomicBoolean running = new AtomicBoolean(false);
 *     
 *     public boolean start() {
 *         return running.compareAndSet(false, true);
 *     }
 *     
 *     public boolean stop() {
 *         return running.compareAndSet(true, false);
 *     }
 *     
 *     public boolean isRunning() {
 *         return running.get();
 *     }
 *     
 *     public void forceStop() {
 *         running.set(false);
 *     }
 * }
 * 
 * // 生产者-消费者状态控制示例
 * class ProducerConsumerControl {
 *     private final AtomicBoolean producing = new AtomicBoolean(false);
 *     private final AtomicBoolean consuming = new AtomicBoolean(false);
 *     
 *     public boolean startProducing() {
 *         // 确保没有在消费时开始生产
 *         if (!consuming.get()) {
 *             return producing.compareAndSet(false, true);
 *         }
 *         return false;
 *     }
 *     
 *     public boolean startConsuming() {
 *         // 确保没有在生产时开始消费
 *         if (!producing.get()) {
 *             return consuming.compareAndSet(false, true);
 *         }
 *         return false;
 *     }
 *     
 *     public void stopProducing() {
 *         producing.set(false);
 *     }
 *     
 *     public void stopConsuming() {
 *         consuming.set(false);
 *     }
 *     
 *     public boolean isProducing() {
 *         return producing.get();
 *     }
 *     
 *     public boolean isConsuming() {
 *         return consuming.get();
 *     }
 * }
 * 
 * // 多线程协作示例
 * class MultiThreadCoordinator {
 *     private final AtomicBoolean initialized = new AtomicBoolean(false);
 *     private final AtomicBoolean shutdown = new AtomicBoolean(false);
 *     
 *     public void initialize() {
 *         if (initialized.compareAndSet(false, true)) {
 *             // 执行初始化逻辑
 *             System.out.println("Initializing...");
 *         }
 *     }
 *     
 *     public void shutdown() {
 *         if (shutdown.compareAndSet(false, true)) {
 *             // 执行关闭逻辑
 *             System.out.println("Shutting down...");
 *         }
 *     }
 *     
 *     public boolean isInitialized() {
 *         return initialized.get();
 *     }
 *     
 *     public boolean isShutdown() {
 *         return shutdown.get();
 *     }
 *     
 *     public boolean isActive() {
 *         return initialized.get() && !shutdown.get();
 *     }
 * }
 * 
 * 最佳实践:
 * 
 * 1. 正确使用compareAndSet:
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    // 正确使用:检查返回值
 *    public boolean trySetFlag(boolean newValue) {
 *        boolean expected = !newValue;
 *        return flag.compareAndSet(expected, newValue);
 *    }
 *    
 *    // 错误使用:忽略返回值
 *    // flag.compareAndSet(false, true); // 没有检查返回值
 * 
 * 2. 合理使用逻辑操作:
 *    AtomicBoolean status = new AtomicBoolean(true);
 *    
 *    // 原子地设置标志位
 *    public void setFlagAtomic() {
 *        status.set(true);
 *    }
 *    
 *    // 原子地翻转标志位
 *    public void toggleFlag() {
 *        boolean current = status.get();
 *        status.compareAndSet(current, !current);
 *    }
 *    
 *    // 原子地进行逻辑操作
 *    public boolean andFlag(boolean value) {
 *        return status.andAndGet(value);
 *    }
 * 
 * 3. 避免竞态条件:
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    // 错误的做法:非原子操作
 *    // if (!flag.get()) {
 *    //     flag.set(true); // 可能出现竞态条件
 *    // }
 *    
 *    // 正确的做法:使用CAS
 *    public boolean tryAcquire() {
 *        return flag.compareAndSet(false, true);
 *    }
 * 
 * 4. 处理复杂的状态转换:
 *    AtomicBoolean state = new AtomicBoolean(false);
 *    
 *    // 复杂的状态转换逻辑
 *    public boolean transitionState(boolean expected, boolean target) {
 *        return state.compareAndSet(expected, target);
 *    }
 *    
 *    // 条件状态设置
 *    public boolean conditionalSet(boolean condition, boolean newValue) {
 *        if (condition) {
 *            return state.compareAndSet(!newValue, newValue);
 *        }
 *        return false;
 *    }
 * 
 * 5. 使用懒设置优化性能:
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    // 当不需要立即可见性时使用lazySet
 *    public void lazyUpdate(boolean newValue) {
 *        flag.lazySet(newValue); // 可能有更好的性能
 *    }
 *    
 *    // 当需要立即可见性时使用set
 *    public void immediateUpdate(boolean newValue) {
 *        flag.set(newValue); // 确保立即可见
 *    }
 * 
 * 6. 监控和调试:
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    // 定期检查状态
 *    public void logStatus() {
 *        System.out.println("Current flag value: " + flag.get());
 *    }
 *    
 *    // 性能监控
 *    public void monitorPerformance() {
 *        long startTime = System.nanoTime();
 *        // 执行一些操作
 *        for (int i = 0; i < 1000000; i++) {
 *            flag.compareAndSet(false, true);
 *            flag.compareAndSet(true, false);
 *        }
 *        long endTime = System.nanoTime();
 *        System.out.println("Time taken: " + (endTime - startTime) + " ns");
 *    }
 * 
 * 7. 异常处理:
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    public void safeUpdate(boolean newValue) {
 *        try {
 *            flag.set(newValue);
 *        } catch (Exception e) {
 *            System.err.println("Update failed: " + e.getMessage());
 *            // 记录日志或采取其他措施
 *        }
 *    }
 * 
 * 8. 批量操作优化:
 *    // 当需要多个标志位时,考虑使用位操作
 *    class MultiFlag {
 *        private final AtomicInteger flags = new AtomicInteger(0);
 *        
 *        public void setFlag(int position, boolean value) {
 *            int mask = 1 << position;
 *            if (value) {
 *                flags.getAndOr(mask);
 *            } else {
 *                flags.getAndAnd(~mask);
 *            }
 *        }
 *        
 *        public boolean getFlag(int position) {
 *            int mask = 1 << position;
 *            return (flags.get() & mask) != 0;
 *        }
 *    }
 * 
 * 9. 状态机实现:
 *    class SimpleStateMachine {
 *        private final AtomicBoolean state = new AtomicBoolean(false);
 *        public static final boolean STATE_A = false;
 *        public static final boolean STATE_B = true;
 *        
 *        public boolean transitionToA() {
 *            return state.compareAndSet(STATE_B, STATE_A);
 *        }
 *        
 *        public boolean transitionToB() {
 *            return state.compareAndSet(STATE_A, STATE_B);
 *        }
 *        
 *        public boolean isInStateA() {
 *            return state.get() == STATE_A;
 *        }
 *        
 *        public boolean isInStateB() {
 *            return state.get() == STATE_B;
 *        }
 *    }
 * 
 * 10. 性能调优:
 *    // 在高并发场景下监控性能
 *    AtomicBoolean flag = new AtomicBoolean(false);
 *    
 *    // 使用局部变量减少volatile访问
 *    public void optimizedCheck() {
 *        boolean localFlag = flag.get();
 *        if (localFlag) {
 *            // 执行相关逻辑
 *        }
 *    }
 *    
 *    // 避免不必要的原子操作
 *    public void conditionalOperation() {
 *        if (flag.get()) { // 先检查
 *            // 再执行原子操作
 *            flag.compareAndSet(true, false);
 *        }
 *    }
 */

6. 与其他原子类的比较

/**
 * AtomicBoolean vs AtomicInteger vs AtomicLong vs AtomicReference:
 * 
 * AtomicBoolean:
 * - 用于boolean类型的操作
 * - 提供get/set/compareAndSet等方法
 * - 内部使用int存储(1表示true,0表示false)
 * - 适用于状态标志
 * - 内存效率高
 * 
 * AtomicInteger:
 * - 用于int类型的操作
 * - 提供丰富的数学运算方法
 * - 32位整数操作
 * - 最常用的原子类
 * 
 * AtomicLong:
 * - 用于long类型的操作
 * - 提供与AtomicInteger类似的方法
 * - 64位整数操作
 * - 适用于需要更大数值范围的场景
 * 
 * AtomicReference:
 * - 用于对象引用的操作
 * - 支持CAS操作对象引用
 * - 适用于复杂对象的原子操作
 * - 可以配合AtomicStampedReference解决ABA问题
 * 
 * 性能对比:
 * - 基本操作:AtomicBoolean ≈ AtomicInteger > AtomicLong > AtomicReference
 * - 内存使用:AtomicBoolean ≤ AtomicInteger < AtomicLong < AtomicReference
 * - 功能丰富度:AtomicReference > AtomicLong ≈ AtomicInteger > AtomicBoolean
 * 
 * 选择建议:
 * - 状态标志:AtomicBoolean
 * - 简单计数:AtomicInteger
 * - 大数值计数:AtomicLong
 * - 对象引用:AtomicReference
 * - 需要版本控制:AtomicStampedReference
 * - 需要标记引用:AtomicMarkableReference
 * 
 * 使用场景:
 * - AtomicBoolean:开关、标志位、简单的状态管理
 * - AtomicInteger:计数器、序列号、简单的数值操作
 * - AtomicLong:时间戳、大计数器、需要64位精度的场景
 * - AtomicReference:复杂对象的原子操作、缓存引用
 */

7. 总结

AtomicBoolean 的核心特性:

  1. 无锁原子操作

    • 使用CAS实现原子性
    • 避免传统锁的开销
    • 提供乐观锁机制
  2. 内存可见性

    • value字段使用volatile修饰(存储为int)
    • 保证多线程间的内存可见性
    • 确保读操作获取最新值
  3. 丰富的原子操作

    • 基本的get/set操作
    • 比较并设置操作
    • 逻辑运算操作(与、或、异或)
  4. 类型优化

    • 内部使用int存储boolean值
    • 与Unsafe的int操作兼容
    • 避免频繁的类型转换
  5. 高性能设计

    • 基于Unsafe的底层操作
    • 字段偏移量直接访问
    • 自旋重试机制
  6. 线程安全

    • 所有操作都是线程安全的
    • 适用于高并发环境
    • 无死锁风险

适用场景:

  • 状态标志管理
  • 开关控制
  • 线程间简单的布尔值通信
  • 需要原子操作的布尔值计算
  • 高并发环境下的状态同步

注意事项:

  • CAS操作虽然对于boolean类型不会出现ABA问题,但仍需正确处理返回值
  • 高竞争场景下可能有自旋开销
  • 不支持复合原子操作(需要多个步骤的原子操作)
  • 需要正确处理CAS的返回值
  • 注意选择合适的更新方法

性能优化建议:

  1. 根据用途选择合适的原子类
  2. 合理使用compareAndSet避免不必要的操作
  3. 在不需要立即可见性时使用lazySet
  4. 监控原子操作的性能表现
  5. 避免不必要的原子操作
  6. 正确处理CAS的返回值
  7. 考虑使用局部变量减少volatile访问
  8. 在复杂状态管理时考虑使用AtomicInteger进行位操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值