`

原子操作的概念

阅读更多

对于并发和原子操作,后面链接的博客中写得很详细:http://www.blogjava.net/xylz/archive/2010/07/08/325587.html

独占锁是一种悲观锁 ,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁 。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,知道成功为止。

-------------------------------------------------------

old

下面的内容来源《Java编程思想3》:

原子操作

"原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。

通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是因为它们都比较大,而JVM的设计规范又没有要求读操作和赋值操作必须是原子操作(JVM可以试着去这么作,但并不保证)。不过如果你在long或double前面加了volatile,那么它就肯定是原子操作了。

如果你一知半解地把这条规则用到SynchronizedEvenGenerator.java上,就会发觉:

public   synchronized   int  getValue() {  return  i; }

好像很符合原子操作的定义嘛。但是把synchronized去掉试试看,程序很快就出了错。这是因为,虽然return i是原子操作,但删掉synchronized之后,别的线程就能在它还处于不稳定状态的时候读到它了。在做这种优化之前,先得真正弄懂这么做的后果是什么。这里没有现成的经验。

最安全的原子操作只有读取和对primitive赋值这两种。但是正如EvenGenerator.java所揭示的,原子操作也能访问正处于无效状态的对象,所以绝对不能想当然。我们一开头就讲了,long和double型的操作不一定时原子操作(虽然有些JVM能保证long和double也是原子操作,但是如果你真的用了这个特性的话,代码就没有可移植性了。)

最安全的做法还是遵循如下的方针:

如果你要synchronize类的一个方法,索性把所有的方法全都synchronize了。要判断,哪个方法该synchronize,哪个方法可以不synchronize,通常是很难的,而且也没什么把握。

删除synchronized的时候要绝对小心。通常这么做是为了性能,但是synchronized的开销在JDK1.3和1.4里已经大为降低了。此外,只有在用profiler分析过,确认synchronized确实是瓶颈的前提下才能这么作。

————————————————————————————————————————————

————————————————————————————————————————————

 

CAS指令与MESI缓存一致性协议

并行

串行

并行程序设计

一 并行计算

      并行计算 是相对于串行计算来说的;所谓并行计算可分为时间上的并行和空间上的并行。 时间上的并行就是指流水线技术 ,而空间上的并行则是指用多个处理器并发的执行计算。并行计算科学中主要研究 的是空间上的并行问题。从程序和算法设计人员的角度来看,并行计算又可分为数据并行任务并行 。一般来说,因为数据并行 主要是将一个大任务化解成相同的各个子任务,比任务并行 要容易处理。

       空间上的并行导致了两类并行机的产生,按照Flynn 的说法分为:单指令流多数据流 (SIMD)和多指令流多数据流 (MIMD)。我们常用的串行机也叫做单指令流单数据流 (SISD)。MIMD类的机器又可分为以下常见的五类:并行向量处理机 (PVP)、对称多处理机 (SMP)、大规模并行处理机 (MPP)、工作站机群 (COW)、分布式共享存储处理机 (DSM)。

二 并行算法

并行算法 是一门还没有发展成熟的学科,虽然人们已经总结出了相当多的经验,但是远远不及串行算法那样丰富。并行算法设计中最常用的的 方法是PCAM方法 ,即划分,通信,组合,映射。首先划分,就是将一个问题平均划分成若干份,并让各个处理器去同时执行;通信阶段,就是要 分析执行过程中所要交换的数据和任务的协调情况,而组合则是要求将较小的问题组合到一起以提高性能和减少任务开销,映射则是要将任务分配到每一个处理器 上。总之,并行算法还需要相当多完善的地方。 并行算法与串行算法最大的不同之处在于,并行算法不仅要考虑问题本身,而且还要考虑所使用的并行模型,网络连接等等。

  • 常见的非数值算法设计方法举例
    • 并行播送并行求和
    • 并行排序 算法;
    • 并行选择 算法:所谓选择问题就是在一给定的序列中选择出某组(个)满足给定条件的元素。
    • 关于图论中的一些并行算法:
      • 图论作为一门到近代才发展起来的科学。在图论中有很多关于如何设计算法 的 问题,比如求最小生成树,单源最短路径等等。事实上,这些算法中有很多是可以并行化的,而且并行化时运用的思想具有很大的启发性,下面是几个常见的并行图 论算法。
    • 关于串处理的并行算法:
      • KMP算法的并行化。
  • 常见的数值算法设计方法举例

三 串行和并行

      在计算方面是说计算机同时执行指令的方式.巨型机、大型机一般是并行计算,而个人电脑则相反.并行计算要快得多,但同样复杂度也高. 总之,同等条件下,并行在速度上有优势,但成本和方便上串行有优势.现在大家所说的串行传输快只是并行传输的成本太高,不方便罢了.

 

分享到:
评论
1 楼 moshalanye 2010-06-17  
楼主还以去了解下  CPU CAS  和  MESI protocol,
对同步的理解会更深一层

相关推荐

    多线程程序中的原子操作

    在多线程编程中,原子操作是一个至关重要的概念。原子操作指的是不可再分割的操作,即在一个操作执行的过程中不会被其他线程打断。这对于保证多线程程序的正确性和避免出现竞态条件至关重要。本文将围绕“多线程程序...

    Redis实现原子操作的两种方式与商品入库出库解决方案.docx

    #### 一、Redis中的原子操作概念及背景 Redis作为一款高性能的键值存储系统,在处理并发请求时保证数据的一致性和完整性至关重要。尤其是在高并发场景下,对于多个键的操作往往需要具备原子性,即要么全部成功,...

    java多线程中的原子操作

    在Java多线程编程中,原子操作是一种非常关键的概念,它涉及到并发控制和线程安全。原子操作是指在不被其他线程中断的情况下,能够完整执行的一个或一系列操作。这样的操作在多线程环境中可以保证数据的一致性和完整...

    并发编程——原子操作CAS.pdf

    学习目标是要理解原子操作的概念,能描述出Java中原子操作类的基本原理,并能正确使用这些类。 在介绍原子操作的实现原理时,文档详细解释了操作的原子性问题,并通过代码示例和执行结果来说明。以一个简单的加法...

    C++中的原子操作:确保并发编程中的线程安全

    本文将详细介绍C++中的原子操作,包括其基本概念、使用场景、API以及如何利用原子操作来避免竞态条件和死锁。 原子操作是C++并发编程中的重要特性,它们为开发者提供了一种高效、灵活且线程安全的方法来处理并发问题...

    C++ 11 开发中的 Atomic 原子操作.rar_C++11、原子_atomic c++_c++ atomic使用_c++

    在进行原子操作时,内存顺序是一个关键概念。C++11提供了五种不同的内存顺序:`memory_order_relaxed`、`memory_order_consume`、`memory_order_acquire`、`memory_order_release`和`memory_order_seq_cst`。不同的...

    C#中使用Interlocked进行原子操作的技巧

    首先,我们需要理解原子操作的概念。原子操作是指一个操作不可被中断,即在执行过程中不会受到其他线程的影响。在多线程环境下,当多个线程尝试同时修改同一数据时,如果不采取任何同步措施,可能会导致数据的不一致...

    JAVA并发编程中文完全版

    - **原子操作概念**:介绍原子操作的基本概念及其重要性。 - **J.U.C包中的Atomic类**:学习`java.util.concurrent.atomic`包中提供的各种原子类的使用方法。 ### 三、Java并发工具类与框架 #### 3.1 高级并发工具...

    MongoDB原子操作与GridFS.pdf

    在 MongoDB 中,原子操作和GridFS是两个关键的概念,它们在处理大量数据和复杂操作时起着重要作用。 1. 原子操作: MongoDB 支持原子操作,这意味着数据库的操作是以最小单元执行的,要么全部完成,要么都不执行。...

    聊聊并发(5)原子操作的实现原理Java开发Java经验技

    在并发编程领域,原子操作是实现线程安全和高效代码的关键技术之一。本文将深入探讨Java开发中的原子操作实现原理,以及如何利用这些知识来优化Java应用。 首先,我们需要理解什么是原子操作。原子操作是指不可分割...

    笔记-3、原子操作CAS1

    在Java编程中,原子操作(Atomic Operation)是并发编程中的一种重要概念,它指的是在多线程环境下,某个操作能够不被其他线程中断,保证其完整性。这在并发编程中至关重要,因为线程间的相互干扰可能导致数据不一致...

    linux_锁_原子_自旋

    在Linux操作系统中,锁、原子操作和自旋锁是内核并发控制的重要机制,用于确保多线程环境下的数据一致性与正确性。这些概念在构建高效、可靠的并发程序时至关重要。 **1. Linux锁** Linux内核中的锁主要用于保护...

    易语言线程安全之原子锁与读写锁

    线程安全通常通过同步机制来实现,其中包括原子操作和锁机制。本文将深入探讨易语言中的原子锁与读写锁。 原子操作是一种不可分割的操作,它在执行过程中不会被其他线程中断。在易语言中,原子操作常用于更新计数器...

    3、并发编程之CAS&Atomic原子操作详解.pdf

    #### 一、原子操作的概念与意义 在计算机科学领域,原子操作是指一系列的操作被视为一个整体,在执行过程中不会被其他进程或线程打断的操作。简而言之,它确保了一系列操作要么全部完成,要么完全不执行。这一特性...

    3.1.7.阻塞队列、原子操作的原理分析1

    虽然在这个例子中没有直接使用原子操作,但在其他情况下,如计数或者更新状态变量,原子操作可以有效地避免竞态条件和数据不一致。 总结来说,阻塞队列如`ArrayBlockingQueue`和原子操作是Java并发编程中的重要工具...

    一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分.doc

    本文将从 CPU 硬件设计带来的优势和问题入手,讲解并发编程中的原子操作、锁机制、Disruptor 框架和 Go 语言中的 Context 概念。 一、并发编程概述 并发编程是指在多个任务之间分配执行时间的编程方式,以提高编程...

    原子例程-寄存器

    当我们谈论“原子例程-寄存器”时,这通常涉及到在处理器级别使用寄存器来实现原子操作。 寄存器是处理器内部的高速存储单元,用于暂时存放指令、数据和计算结果。由于访问寄存器的速度远高于访问内存,所以在设计...

    C++ 标准库原子库解析

    Fedor在讲解中还指出,虽然原子操作在硬件层面上是由特殊指令保证其原子性的,但这一概念并不仅限于硬件。例如,数据库的事务可以视为一种高级别的原子操作,尽管它们涉及多个底层的硬件或软件操作。 值得注意的是...

Global site tag (gtag.js) - Google Analytics