`
ray_yui
  • 浏览: 216716 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发编程 — 并发数据类型

    博客分类:
  • Java
阅读更多

并发编程系列文章:
      初解线程池: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类让我们直接使用,推荐遇到类似需求直接使用已提供好的工具
19
4
分享到:
评论
6 楼 ray_yui 2014-06-30  
mahongming 写道
cas虽好,但是是以浪费CPU计算资源为代价的,只是不需要不同线程做频繁的上下文切换或者自旋,在对称架构的多CPU情况下,如果对原子做大并发的操作,BUS的IO会非常高,寄存器和内存需要不停的做比较更新也挺蛋疼。

非常感謝,受教!
5 楼 mahongming 2014-06-27  
cas虽好,但是是以浪费CPU计算资源为代价的,只是不需要不同线程做频繁的上下文切换或者自旋,在对称架构的多CPU情况下,如果对原子做大并发的操作,BUS的IO会非常高,寄存器和内存需要不停的做比较更新也挺蛋疼。
4 楼 huangningren 2014-06-18  
mark下!
3 楼 SpringJava 2014-06-18  
太好了~~~非常感谢~
2 楼 zhanghaichang 2014-06-16  
标记一下,下次看。
1 楼 西南酱油王 2014-06-16  
并发or并行

相关推荐

    Java并发编程实战

    3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...

    Java 并发编程实战

    3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...

    Go并发编程实战+第2版_Lite.pdf_golang_

    本书首先介绍了Go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语法基础、数据类型以及流程控制方法,接着阐述了与多进程编程和多线程编程有关的知识,然后重点介绍了goroutine、channel以及Go提供的...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    学习Java技术需要掌握多个方面,包括语言基础、面向对象编程、Java标准库、框架与工具、并发编程、以及其他相关的技

    学习Java技术需要掌握多个方面,包括语言基础、面向对象编程、Java标准库、框架与工具、并发编程、以及其他相关的技术。以下是一些Java技术学习的要点: Java语言基础: 数据类型、变量和运算符。 控制流程语句...

    最新Python深度之眼高级开发班 Python并发编程与高级开发技术实战课程 Python特优课程

    ├─03 第三章:数据类型.pdf ├─03第三章:数据类型.mp4 ├─04 第四章:字符编码.pdf ├─04第四章:字符编码.mp4 ├─05 第五章:文件处理.pdf ├─05第五章:文件处理.mp4 ├─第一阶段:02作业参考答案.docx ...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    基本数据类型,核心点整理 特殊的String类,以及相关扩展API 日期与时间API详解 流程控制语句,和算法应用 函数式编程概念和应用 集合容器 基于分析列表集合源码体系 基于分析地图集合源码体系 IO流机制 IO流核心...

    C#经典实例(第4版) 徐敬德(译) 非扫描版 高清带书签

    具体内容包括:类和泛型,集合、枚举器和迭代器,数据类型,语言集成查询和lambda表达式,调试和异常处理,反射和动态编程,正则表达式,文件系统I/O,网络和Web,XML,安全,线程、同步和并发,工具箱。本书使用...

    Go语言中的并发问题研究

    所以, 到目前为止,还不清楚 Go 的这些并发机制是否真的比传统语言更容易适用千并发编程, 更不容易出错。 本文在开源社区 GitHub上选取了六个开源的并且用于实际生产环境中的Go应用程序对 Go 语言中并发 Bugs 进行...

    Red语言:向编程复杂性反击

    Red 是一门新的编程语言,它受到了 REBOL 很大的启发,但由于它有本地代码编译器,Red 的应用领域更加广泛——下到系统编程上到高级脚本,同时提供了对现代的多核 CPU 并发编程的支持。 主要特点为: 函数式、声明...

    Rust 并发编程工具

    横梁这个 crate 提供了一组用于并发编程的工具:原子AtomicCell ,一个线程安全的可变内存位置。(no_std) AtomicConsume ,用于从具有“消费”顺序的原始原子类型中读取。(no_std) 数据结构deque ,用于构建任务调度...

    《Java 8 in Action》是一本关于 Java 编程语言的书籍,重点介绍了 Java 8 中引入的新特性和改进

    并发编程改进: 讨论 Java 8 中对并发编程的改进,包括 CompletableFuture、新的并发工具和并发数据结构等。 其他新特性: 简要介绍 Java 8 中引入的其他新特性,如接口的默认方法、方法引用、Optional 类型等。

    编程知识+GO语言开发+GO语言基础课程+系列课程

    并发编程:深入Go的并发模型,包括Goroutines和Channels,掌握并发编程的技巧和错误处理。 接口与类型系统:探索Go的接口、类型断言、结构体和嵌入式类型,学习如何构建灵活的软件设计。 高级特性:学习Go的反射、...

    Rust是一门系统编程语言,它强调安全性、并发性和性能 以下是关于Rust的500字资源介绍: Rust由Mozilla研究院

    Rust的所有权系统和类型系统使得编写并发程序更加安全和方便,避免了数据竞争和死锁等问题。 Rust支持多种平台,包括Windows、Linux、MacOS等,可以轻松地实现跨平台开发。这使得Rust在操作系统、嵌入式系统、驱动...

    16030110032_张瑞_网络应用程序设计实验.zip

    掌握基本套接字函数使用方法、TCP协议工作原理、并发服务原理和编程方法。实验内容:在linux平台上实现1个TCP并发服务器,至少可以为10个客户端同时提供服务。 2. 进程间的协调通信(4学时) 掌握进程的概念、进程间...

    从metal到meta(全栈编程语言Red)

    Red 是一门新的编程语言,它受到了 REBOL 很大的启发,但由于它有本地代码编译器,Red 的应用领域更加广泛——下到系统编程上到高级脚本,同时提供了对现代的多核 CPU 并发编程的支持。 主要特点为: 函数式、声明...

    编程课程+GO语言编程+技术开发+系列课程

    课程首先介绍Go语言的安装和基础语法,包括数据类型、控制结构和错误处理,为学习者打下坚实的基础。随后,课程深入Go的并发模型,通过Goroutines和Channels,学习者将掌握并发编程的核心概念和实践技巧。 在接口与...

    lwt, OCaml承诺和并发 I/O.zip

    lwt, OCaml承诺和并发 ... 它提供了一个数据类型: 承诺,这是一个将在未来确定的价值。 创建一个承诺产生一个计算。 当计算为 I/O 时,我们用你的OCaml代码并行运行它。在默认情况下,在单个线程中运行about代码,因这

    crossbeam:Rust中的并发编程工具

    横梁 此板条箱提供了一组用于并发编程的工具:原子学 ,一个线程安全的可变内存位置。 (no_std) ,用于按“消费”顺序读取原始原子类型。 (no_std)数据结构 ,用于窃取任务的 ,用于构建任务调度程序。 ,一个有...

Global site tag (gtag.js) - Google Analytics