计算机的高速发展,在多核技术上要远远快于提升单核的计算能力。因而设计并发的程序成为提高软件性能的一大利器。
并发的程序虽然可以有效利用硬件资源,但同时也会增加程序设计的难度,其首要解决的就是同步的问题。
同步问题归纳而言就是要解决两个问题:活性失败(liveness failure)和 安全性失败(safety failture)。
解决的办法归纳起来也是两大类
对于第一点来说,无论你是用哪种语言,都是一样的。
那么,针对第二点,让我们来看一下C#和Java在处理同步上的一些大同小异。
解决活性失败,C#和Java都提供了volatile这个关键字来修饰变量。这个关键字可以让程序运行时对被修饰的变量无条件的在高速缓存和主内存中实现数据同步。使用这个关键字可以解决数据不新鲜的问题,但是切记不可乱用,因为它会带来额外的性能开销,让高速缓存变得没有意义。
解决活性失败,当然也可以使用各种同步机制,这些同步机制也可以让需要在一起完成的操作不被其他线程打扰,成为原子操作,从而解决安全性失败问题。
同步大体来说可以分为两种
在C#和Java中,比较典型的非阻塞同步机制就是自旋锁。
而同步机制的实现机制则是五花八门。
由于C#主要应用的平台在于windows,所以基本上它的同步机制都是基于windows的一些同步原语,包括事件,互斥锁,信号量,监视器;当然也有优化后的读写锁,瘦锁等等。
Java由于是跨平台的,所以提供的同步机制都需要jvm支持。可供选择的同步机制和封装有synchronized, ReentrantLock,CountDownLatch, CyclicBarrier, DelayQueue, PriorityBlockngQueue, ScheduledExecutor, Semaphore, Exchanger.
后续我们单独对每种实现进行相应的比较。
原文:http://www.cnblogs.com/diufeng/p/7195397.html