Java CAS和ABA问题
本文转自Java CAS 和 ABA 问题
Java CAS 和 ABA 问题
独占锁:是一种悲观锁,synchronized 就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS 操作乐观锁用到的机制就是 CAS,Compare and Swap。
CAS 有 3 个操作数,内存值 V,旧的预期值 A,要修改的新值 B。当且仅当预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都不做。
非阻塞算法 (nonblocking algorithms)
一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。
现代的 CPU 提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。
AtomicInteger 示例拿 AtomicInteger 来研究在没有锁的情况下是如何做到数据正确性的。
1private volatile int value;
在没有锁的机制下需要借 ...
多级缓存和一致性协议
多级缓存为什么需要 CPU cache?CPU 的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU 常常需要等待主存,浪费资源,所以 cache 的出现,是为了缓解 CPU 和内存之间速度的不匹配问题(结构:cpu->cache->memort)
cache 工作原理cache 的工作原理是基于“局部性”原理,它包含以下两个方面:
时间局部性:如果某个数据被访问,那么在不久的将来他很可能被再次访问
空间局部性:如果某个数据被访问,那么与他相邻的数据很快也可能被访问
多级缓存是什么左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU 核心与高速缓存有一条特殊的快速通道;主存和高速缓存都连在系统总线上,这条总线还用于其他组件的通信。高速缓存出现不久,系统变得越来越复杂,高速缓存与主存之间的速度差异被拉大,直到加入了另一级缓存,新加入的这级缓存比第一缓存更大,而且更慢,而且经济上不合适,所以有了二级缓存,甚至是三级缓存。
cache 带来的问题cache 给系统带来性能上飞跃的同时,也引入了新的问题“缓存一致性问题”。设想如下场景(cpu 一共有两 ...
线程池
本文转自java 线程池总结
线程池
池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。
线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。
这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
Executor 框架简介Executor 框架是 Java5 之后引进的,在 Java 5 之后,通过 Executor 来启动线程比使用 Thread 的 start 方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。
补充:this 逃逸是指在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误。
Ex ...
线程同步
为什么需要同步在大多数实际的多线程应用中,两个或两个以上线程需要共享对统一数据的存取。如果两个线程同时修改一个对象,可能就是导致数据不准确,使对象状态混乱,引起程序错误。因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。
代码示例:
123456789101112131415161718192021222324252627282930313233343536373839// 模拟三个人买票,一人买10张public class BuyTicket { public static void main(String[] args) { UnsafeBuyTicket unsafeBuyTicket = new UnsafeBuyTicket(); new Thread(unsafeBuyTicket, "我").start(); new Thread(unsafeBuyTicket, "你").start(); new T ...
多线程
定义通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序被称为多线程程序。
并行与并发此模块内容大部分来自博客园-并行与并发的区别
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群。并发是在一台处理器上“同时”处理(实际上是交替执行)多个任务,
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
举例假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务
顺序执行:老师甲先帮学生 A 辅导,辅导完之后再取给 B 辅导,最后再去给 C 辅导,效率低下 ,很久才完成三个任务
并发:老师甲先给学生 A 去讲思路,A 听懂了自己书写过程并且检查,而甲老师在这期间直接去给 B 讲思路,讲完思路再去给 C 讲思路,让 B 自己整理步骤。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,在这之后,老师是完全 ...