说明:本篇文章是在阅读《Java 并发编程艺术》过程中的一些笔记和分析,由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步!
该项目的地址:https://github.com/xiaoheng1/concurrent-programming
欢迎有兴趣的小伙伴加入,一起讨论、分析,共同进步!
atomic 包中的 13 个类,属于 4 中类型的原子更新方式.
(1)原子更新基本类型
(2)原子更新数组
(3)原子更新引用
(4)原子更新属性
atomic 包里的类基本都是使用 Unsafe 实现的包装类.
1.原子更新基本类型
(1) AtomicBoolean
(2) AtomicInteger
(3) AtomicLong
本类以 AtomicInteger 进行讲解:
int addAndGet(int delta) 以原子方式将输入的数值与实例中的值相加,并返回结果
boolean compareAndSet(int expect, int update) 如果输入的数值等于预期值,则以原子的方式将该值设置为输入的值.
int getAndIncrement() 以原子方式将当前值加 1,注意,这里返回的是自增前的值.
void lazySet(int newValue) 最终会设置成 newValue,使用 lazySet 设置值后,可能导致其他线程在之后的一小段时间内还是可以读到
旧值.
int getAndSet(int newValue) 以原子方式设置为 newValue 的值,并返回旧值.
getAndIncrement 是如何实现原子操作的了?
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
我们可以看到,它的实现原理是死循环 + CAS.
2.原子更新数组
(1) AtomicIntegerArray 原子更新整形数组里的元素
(2) AtomicLongArray 原子更新长整形数组里的元素
(3) AtomicReferenceArray 原子更新引用类型数组里的元素
AtomicIntegerArray 类提供方法如下:
(1) int addAndGet(int i, int delta) 以原子方式将输入值与数组中的索引 i 的元素相加
(2) boolean compareAndSet(int i, int expect, int update) 如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成 update 值.
3.原子更新引用类型
原子更新基本类型的 AtomicInteger, 只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类.
(1) AtomicReference 原子更新引用类型
(2) AtomicReferenceFieldUpdate 原子更新引用类型里的字段
(3) AtomicMarkableReference 原子更新带有标记位的引用类型.
分享到:
相关推荐
总结来说,Java多线程中的原子操作是保证并发安全的重要手段,通过使用`java.util.concurrent.atomic`包中的原子类,开发者可以编写出高效且线程安全的代码。同时,自定义的数据结构和工具类如CircularSet和...
Kotlinx.AtomicFu是Kotlin社区的一个开源项目,它提供了在Kotlin中使用原子操作(Atomic Operations)的简便工具和库。这个项目主要是为了解决多线程环境下的并发问题,尤其是在非Java平台如JavaScript或者Native上...
在Java的并发编程中,AtomicInteger 是一个非常重要的原子类,它提供了一种无锁的机制来保证整数操作的原子性。本文将详细介绍 AtomicInteger 的工作原理、使用方法以及如何在实际项目中应用它。 AtomicInteger 是...
Java中的`AtomicIntegerArray`是`java.util.concurrent.atomic`包中的一个类,它提供了一种在多线程环境下原子性地更新整型数组元素的方法。这个类和其他两个类似类——`AtomicLongArray`(用于原子更新长整型数组)...
在JDK 8中新增的4个原子操作类: 1. `AtomicIntegerFieldUpdater`:与JDK 7的AtomicIntegerFieldUpdater类似,但适用于非静态字段。 2. `AtomicLongFieldUpdater`:与JDK 7的AtomicLongFieldUpdater类似,但适用于非...
综上所述,"Java数据库操作封装类"是Java开发中的一个重要工具,它通过吸收和整合主流数据库类库的优秀实践,提供了一种简洁、高效的方式来处理数据库交互,提高了代码的可读性和可维护性。而"repositories.xml"则...
本文将深入探讨Java开发中的原子操作实现原理,以及如何利用这些知识来优化Java应用。 首先,我们需要理解什么是原子操作。原子操作是指不可分割的操作,它要么全部完成,要么完全不执行,中间不会被其他线程中断。...
原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、可移植、高性能和...
`AtomicLongArray`是Java并发库提供的一个原子性操作长整型数组的类,它支持线程安全的增加、减少、比较并设置、获取和设置等操作,而无需使用锁或其他同步机制。这使得在高并发场景下,多个线程可以并发地修改数组...
在Java编程中,原子操作(Atomic Operations)是一种用于在多线程环境中确保操作不可分割的技术,它对于实现高效并发程序至关重要。在Java中,`java.util.concurrent.atomic`包提供了一系列的原子类,如`...
Java原子类大部分是基于CAS和volatile实现的。volatile关键字保证了变量的可见性,即一个线程对变量的修改,可以被其他线程即时看见。结合CAS,原子类能够以无锁的方式实现多线程的安全更新。 然而,CAS机制并非...
AtomicInteger是Java中的一个原子变量类,它可以对整型变量进行原子操作。它提供了许多有用的方法,例如get()、getAndSet()、getAndIncrement()、getAndDecrement()、getAndAdd()等。 例如,使用AtomicInteger可以...
但是,`volatile`并不能确保原子性,例如`volatile int a`,虽然`a`的值对所有线程可见,但是`a++`操作仍然不是原子性的,因为它包含了读、改、写的三个步骤,所以依然存在线程安全问题。 在提供的代码示例中,`...
Java原子操作CAS原理解析是Java并发编程中的一种机制,用于解决多线程并行情况下使用锁造成的性能损耗。CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的值与预期原值相匹配,那么...
本文档详细介绍了并发编程中的原子操作,特别是Java语言中通过CAS(Compare-And-Swap)实现的原子操作,并指出了在实际编程中如何使用和实现原子操作。 首先,文档开篇就介绍了原子操作的定义。所谓原子操作,指的...
Unsafe类是Java中的一个特殊类,提供了一些底层操作,包括CAS算法的实现。Unsafe类的compareAndSwapInt方法是实现CAS算法的关键。 CAS算法的实现 CAS算法的实现可以分为两种方式:总线加锁和缓存加锁。总线加锁是...
标题中的“Java操作Access数据库文件工具类”指的是使用Java编程语言来与Microsoft Access数据库进行交互的工具类。在Java中,我们通常通过JDBC(Java Database Connectivity)API来实现这样的功能,它允许Java程序...
总结来说,Java中的原子操作类和非阻塞算法是实现高效并发编程的关键技术。通过使用这些工具,开发者可以编写出性能优异、线程安全的代码,同时避免了传统锁机制带来的复杂性和潜在问题。对于理解和掌握Java并发编程...
在Java编程语言中,原子类(Atomic Classes)是并发编程中的一个重要工具,它们提供了一种在多线程环境下实现高效、安全的变量操作方式。这些类位于`java.util.concurrent.atomic`包下,能够保证在不使用锁的情况下...