安卓中并发总结
安卓中并发总结
一、JMM内存模型和并发
JMM规定了内存主要划分为主内存和工作内存两种,内存模型示意如下:
1、缓存一致性
现在的手机通常有两个或者多个CPU,其中一些CPU还有多核。每个CPU在某一时刻都能运行一个线程,这就意味着,如果你的Java程序是多线程的,那么就有可能存在多个线程在同一时刻被不同的CPU执行的情况。
2、指令重排
为了使CPU内部的运算单元能够尽量被充分利用,处理器可能会对输入的字节码指令进行重排序处理,也就是处理器优化。除了CPU之外,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。
3、内存交互操作
4、内存屏障
Store:将处理器缓存的数据刷新到内存中。
Load:将内存存储的数据拷贝到处理器的缓存中。
实际上就是如果CPU在指令优化是给一个标记位置,碰到此位置不进行优化
二、锁
1、临界区和竞态条件
一段代码块内如果存在对共享资源的多线程读写操作,称这段代码为临界区
多个线程在临界区内执行,由于代码执行序列不同而导致结果无法预测,称之为静态条件;
2、应用之互斥
为了避免临界区的竞态条件发生,JAVA提供多种手段进行规避
阻塞式的解决方案:synchronized,Lock
非阻塞式的解决方案:原子变量
synchronized对象锁:
采用互斥方式让统一时刻之多只有一个线程持有对象锁,其他线程在获取这个对象锁会被阻塞,不用担心线程上下文切换。
3、Monitor对象与synchronized
执行同步代码块内容,然后唤醒entryList中其他线程时,此处采取竞争策略,先到不一定先得,所以synchronize锁是非公平
非公平锁: 在锁可用的时候,一个新到来的线程要占有锁,可以不需要排队,直接获得。
公平锁: 在锁可用的时候,一个新到来的线程要占有锁,需要排队,等待执行
4、CAS
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。
CAS机制当中使用了3个基本操作数:内存地址V、旧的预期值A、要修改的新值B
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。