非阻塞同步算法与CAS(Compare and Swap)无锁算法

CAS html

http://www.javashuo.com/article/p-pbpgnwjw-eo.html缓存

 

锁是用来作并发最简单的方式,固然其代价也是最高的。内核态的锁的时候须要操做系统进行一次上下文切换,加锁、释放锁会致使比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu以前缓存的指令和数据都将失效,对性能有很大的损失。操做系统对多线程的锁进行判断就像两姐妹在为一个玩具在争吵,而后操做系统就是能决定他们谁能拿到玩具的父母,这是很慢的。用户态的锁虽然避免了这些问题,可是其实它们只是在没有真实的竞争时才有效。多线程

Java在JDK1.5以前都是靠synchronized关键字保证同步的,这种经过使用一致的锁定协议来协调对共享状态的访问,能够确保不管哪一个线程持有守护变量的锁,都采用独占的方式来访问这些变量,若是出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他们的时间片之后才能被调度执行,在挂起和恢复执行过程当中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能作任何事。若是一个线程在持有锁的状况下被延迟执行,那么全部须要这个锁的线程都没法执行下去。若是被阻塞的线程优先级高,而持有锁的线程优先级低,将会致使优先级反转(Priority Inversion)。并发

乐观锁与悲观锁

相关文章
相关标签/搜索