并发编程系列文章:
初解线程池:http://ray-yui.iteye.com/blog/2072463
详解线程池:http://ray-yui.iteye.com/blog/2075311
并发数据类型:http://ray-yui.iteye.com/blog/2080454
并发数据结构:http://ray-yui.iteye.com/blog/2084202
volatile:http://ray-yui.iteye.com/blog/2231474
判断线程安全:http://ray-yui.iteye.com/blog/2232931
实现线程安全:http://ray-yui.iteye.com/blog/2234688
在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条线程对共享变量的修改,JDK1.5后为我们提供了一组实现了无锁算法(CAS算法)的类,他们分别包装了Integer,Long,Boolean和Integer,Long对应的数组类型
AtomicInteger(Long)核心方法:
public final int get() | 获取当前值 |
public final void set(int newValue) | 设置当前值 |
public final int getAndSet(int newValue) | 设置新值并返回旧值 |
public final boolean compareAmdSet(int expect,int u) | 若当前值为expect,设置为u |
public final int getAndIncrement() | 当前值加1,返回旧值 |
public final int getAndDecrement() | 当前值减一,返回旧值 |
public final int getAndAdd(int delta) | 当前值增加delta,返回旧值 |
public final int incrementAndGet() | 当前值加1,返回新值 |
public final int decrementAndGet() | 当前值减1,返回新值 |
public final int addAndGet(int delta) | 当前值增加delta,返回新值 |
其他类或方法请参考JDK帮助文档
AtomicReference |
AtomicReferenceArray |
AtomicBoolean |
AtomicInteger |
AtomicIntegerArray |
AtomicLong |
AtomicLongArray |
我们来看一下CAS算法在AtomicInteger中是如何体现出现到
/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue
* the new value
* @return the previous value
*/
public final int getAndSet(int newValue) {
for (;;) { // 死循环不停尝试,直到成功
int current = get(); // 获取当前值
// 若当前值未受其他线程影响,设置为新值,否则进入第二次循环
if (compareAndSet(current, newValue))
return current;
}
}
在CAS算法当中,首先程序体处于一个无限循环当中,在获取当前值后,使用compareAndSet进行比较,若然其他线程对当值进行修改,compareAndSet將返回false从而进入第二次循环,直到成功.在硬件层面,绝大部分的现代处理器已经支持了原子化的CAS指令,在JDK5.0后JVM已可以使用这个指令来实现并发操作和并发数据结构
除了Integet和Long等自增类型的原子性操作类外,JDK还提供了更令人心动的类型AtomicReference<V>,他能引用所有的引用类型
public class TestMain {
@Test
public void testAtomicReference() throws Exception {
/*
* 注意:
* 要使用AtomicReference引用的类最好重写equals方法
* compareAndSet将会使用 == 来判断对象是否相等
*/
RayTest test1 = new RayTest();
RayTest test2 = new RayTest();
// 初始化 AtomicReference,默认值为test1
AtomicReference<RayTest> reference = new AtomicReference<RayTest>(test1);
// 將test1替换为test2
reference.compareAndSet(test1, test2);
Assert.assertNotSame(test1, reference.get());
Assert.assertEquals(test2, reference.get());
}
}
在CAS算法当中,整个过程无需加锁,无需等待,无锁的操作实际上可以将多条线程的并发冲突处理由应用层面自行决定,从而提升系统的性能,但使用CAS算法的编码复杂度明显地增加,还好JDK已为我们提供了Atomic类让我们直接使用,推荐遇到类似需求直接使用已提供好的工具
分享到:
相关推荐
在并发控制方面,《Java并发编程实战》可能会探讨不同类型的锁,如互斥锁(Mutex)、读写锁(ReadWriteLock)、乐观锁和悲观锁等,以及它们的应用场景和性能影响。作者可能会使用实例代码来演示如何在实际应用中使用...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
并发编程中的同步机制是防止多个线程同时访问共享资源导致数据不一致的关键。Java提供了多种同步工具,如synchronized关键字、 volatile变量、java.util.concurrent包下的Lock接口(如ReentrantLock)以及Atomic类等...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
在Java中,对基本数据类型的变量进行读取和赋值操作是原子性的,但是像复合操作(例如自增)就不是原子的。解决原子性问题的方案包括使用synchronized关键字、Lock接口实现类以及CAS(Compare-And-Swap)操作。 ...
2. **同步机制**:并发编程中的数据竞争问题需要同步机制来解决。C++提供了多种同步原语,如互斥量(`std::mutex`)、条件变量(`std::condition_variable`)、信号量(`std::semaphore`)等。互斥量用于保护共享...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
传统的并发数据结构设计往往依赖于锁,而无锁数据结构则通过使用原子操作来实现线程安全,它们各有优劣。书中会对比这两种设计方法,并提供一些实用的设计模式。 在并发编程中,代码的设计至关重要。书中的“并发...
2. **Channels**:Channels是Go语言中实现并发安全通信的关键工具,它们提供了一种安全的方式,让goroutines之间能够共享数据,避免了传统并发编程中的数据竞争问题。通过发送和接收操作,goroutines可以共享数据流...
3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...
在处理并发编程中,不可避免的需要考虑数据同步和线程安全问题。KVO(键值观察)作为一种观察者模式的实现,允许对象观察和响应属性值的变化,可以用来在多线程环境中同步数据。 除了上述的并发编程工具,iOS开发还...
### Netty教程并发编程知识点详解 #### 一、Netty简介与并发模型基础 ##### 1.1 Netty概述 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器与客户端。它提供了对TCP、...
### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这...理解和掌握这些概念和技术是成功进行并发编程的关键。
- **原子操作**:对于一些基本的数据类型,Java提供了`AtomicInteger`、`AtomicLong`等原子类来进行无锁的原子操作。 - **并发集合**:Java并发包(`java.util.concurrent`)提供了许多线程安全的集合类,如`...
- **Atomic类族**:如`AtomicInteger`、`AtomicLong`等,提供了基本数据类型的原子更新功能。 - **AtomicReference**:用于原子地更新引用类型。 #### 2.3 高级并发工具 - **Semaphore**:信号量,用于控制对有限...
### Windows并发编程指南知识点概述 #### 一、概念部分(Concepts) ##### 1. 引言 (Introduction) - **为什么需要并发?** - 并发编程是现代多核处理器环境下提高程序性能的关键手段之一。 - 多任务处理的需求...
### Java并发编程的艺术 #### 一、并发编程的挑战与应对策略 本书开篇即指出,随着现代计算机系统越来越依赖于多核处理器的并行计算能力,Java开发人员面临着前所未有的并发编程挑战。这些挑战包括但不限于数据...
《C++并发编程经典实例》是一本专注于C++并发编程领域的专著,旨在帮助开发者深入理解和掌握在C++中进行多线程和并发编程的技术。这本书可能是2018年出版,并提供了高清的PDF格式,方便读者在线阅读或打印学习。 ...