iOS atomic和noatomic

iOS属性atomic与nonatomic解析

iOS atomic和nonatomic

在命名属性的时候经常用到这两个属性。主要区别在声明属性的getter 和setter方法中

atomic 原子性主要是在多线程环境中使用,setter方法加锁(原子不可中断性),保证线程安全。

nonatomic是在保证不再多线程环境中使用时,使用非线程安全修饰,如此可提高性能。


在 Java 并发编程中,`Atomic` 类 `Unsafe` 类都用于实现线程安全的操作,但它们在使用方式、安全性、性能适用场景上有显著区别。 --- ### 1. **Atomic 类** Java 提供了 `java.util.concurrent.atomic` 包中的一系列原子类,如 `AtomicInteger`、`AtomicLong`、`AtomicReference` 等,用于实现对变量的原子操作。 - **特点**: - 提供了基于 CAS(Compare-And-Swap)的原子操作。 - 线程安全,无需显式加锁。 - 使用简单,封装良好。 - **示例**: ```java AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 原子自增 ``` - **底层实现**:依赖于 `Unsafe` 类提供的 CAS 操作。 --- ### 2. **Unsafe 类** `Unsafe` 是 Java 提供的一个类(`sun.misc.Unsafe`),提供了底层的内存操作能力,如直接访问内存、线程阻塞/唤醒、CAS 操作等。 - **特点**: - 提供底层操作能力,如内存分配、对象字段偏移量获取、CAS 操作等。 - 不受 Java 安全机制限制,使用不当会导致 JVM 崩溃。 - 通常用于构建高性能并发库(如 `Atomic` 类、`AQS`、`ForkJoinPool` 等)。 - **获取方式**: ```java // 通常通过反射获取 Unsafe 实例(不推荐普通应用使用) Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); Unsafe unsafe = (Unsafe) field.get(null); ``` - **CAS 操作示例**: ```java long offset = unsafe.objectFieldOffset(MyClass.class.getDeclaredField("value")); boolean success = unsafe.compareAndSwapInt(instance, offset, expectedValue, newValue); ``` --- ### 3. **Atomic 与 Unsafe 的关系** - `Atomic` 类的底层实现依赖于 `Unsafe` 提供的 CAS 操作。 - `Unsafe` 提供了更底层的能力,但使用风险高;`Atomic` 类则封装了这些操作,提供了更安全的接口。 - `Unsafe` 可以用于构建自定义的无锁数据结构,但一般推荐使用 `Atomic` 类或 `java.util.concurrent` 包中的并发工具。 --- ### 4. **适用场景** | 特性 | Atomic 类 | Unsafe 类 | |--------------|-------------------------------------|------------------------------------| | 使用难度 | 简单,封装良好 | 复杂,需理解底层机制 | | 安全性 | 安全,线程无锁 | 高风险,不当使用可能导致崩溃 | | 性能 | 高性能,基于 CAS | 极致性能,但需谨慎使用 | | 推荐用途 | 应用层并发控制 | 框架或库的底层实现 | --- ### 总结 - `Atomic` 类是基于 `Unsafe` 实现的线程安全操作封装。 - `Unsafe` 提供了更底层的能力,适合构建高性能并发组件。 - 在日常开发中应优先使用 `Atomic` 类,避免直接使用 `Unsafe`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值