对于并发和原子操作,后面链接的博客中写得很详细: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也是原子操作,但是如果你真的用了这个特性的话,代码就没有可移植性了。)
最安全的做法还是遵循如下的方针:
1 如果你要synchronize类的一个方法,索性把所有的方法全都synchronize了。要判断,哪个方法该synchronize,哪个方法可以不synchronize,通常是很难的,而且也没什么把握。
2 删除synchronized的时候要绝对小心。通常这么做是为了性能,但是synchronized的开销在JDK1.3和1.4里已经大为降低了。此外,只有在用profiler分析过,确认synchronized确实是瓶颈的前提下才能这么作。
————————————————————————————————————————————
————————————————————————————————————————————
CAS指令与MESI缓存一致性协议
并行
串行
并行程序设计
一 并行计算
并行计算 是相对于串行计算来说的;所谓并行计算可分为时间上的并行和空间上的并行。 时间上的并行就是指流水线技术 ,而空间上的并行则是指用多个处理器并发的执行计算。并行计算科学中主要研究 的是空间上的并行问题。从程序和算法设计人员的角度来看,并行计算又可分为数据并行 和任务并行 。一般来说,因为数据并行 主要是将一个大任务化解成相同的各个子任务,比任务并行 要容易处理。
空间上的并行导致了两类并行机的产生,按照Flynn 的说法分为:单指令流多数据流 (SIMD)和多指令流多数据流 (MIMD)。我们常用的串行机也叫做单指令流单数据流 (SISD)。MIMD类的机器又可分为以下常见的五类:并行向量处理机 (PVP)、对称多处理机 (SMP)、大规模并行处理机 (MPP)、工作站机群 (COW)、分布式共享存储处理机 (DSM)。
二 并行算法
并行算法 是一门还没有发展成熟的学科,虽然人们已经总结出了相当多的经验,但是远远不及串行算法那样丰富。并行算法设计中最常用的的 方法是PCAM方法 ,即划分,通信,组合,映射。首先划分,就是将一个问题平均划分成若干份,并让各个处理器去同时执行;通信阶段,就是要 分析执行过程中所要交换的数据和任务的协调情况,而组合则是要求将较小的问题组合到一起以提高性能和减少任务开销,映射则是要将任务分配到每一个处理器 上。总之,并行算法还需要相当多完善的地方。 并行算法与串行算法最大的不同之处在于,并行算法不仅要考虑问题本身,而且还要考虑所使用的并行模型,网络连接等等。
- 常见的非数值算法设计方法举例
- 常见的数值算法设计方法举例
三 串行和并行
在计算方面是说计算机同时执行指令的方式.巨型机、大型机一般是并行计算,而个人电脑则相反.并行计算要快得多,但同样复杂度也高. 总之,同等条件下,并行在速度上有优势,但成本和方便上串行有优势.现在大家所说的串行传输快只是并行传输的成本太高,不方便罢了.