android 线程那些事
线程和线程安全
线程是什么
- 线程为进程的一个实体
- 轻量级进程
- 是CPU调度和分配的基本单位
- 可与同一进程内的线程共享进程内的全部资源
- android 进程通过fork创建,线程通过pthread.creat创建
并发的优势促使多线程的出现
- 资源利用率 ,提高
- 公平性,共享资源
- 便利性,多任务并发执行比单任务更容易执行
线程安全
多线程的引入意味着引入了线程安全。当单线程能正确运行的代码,在多线程访问的情况下,不管线程以何种顺序访问,并不添加同步代码都能正确表现行为,则称它为线程安全的
并发的三大要素
原子性
指的是一个或者多个不能再被分割的操作
value = 1; //院子操作
value++; //复合操作
数据竞争
指多进程访问共享资源,不做同步
有序性
可见性
当一个线程对某个变量做出修改时,其他线程可以立刻读取修改后的值
volatile
- 是一种稍弱的同步机制,用来确保变量更新操作同步到其他线程,虚拟机不会指令重排
- 锁与volatile不同,锁具有两个特性:互斥性和可见性
内置锁
Sychronized关键字
可作用于class和java对象
锁的原理
- 锁实现了内存可见性和操作原子性
- 释放锁时,该线程的本地内存中的共享变量会被刷新到内存中
- 锁不会被继承
- 同步代码块是使用monitorenter和monitorexit指令实现的,同步方法是通过ACC_SYNCHRONIZED标识符实现
锁的使用原则
- 可能被多个线程同时访问的可变变量,在访问它时都需要持有一个锁,变量由这个锁保护
- 每个可变变量都只有一个锁来保护,知道锁的范围
- 当锁作用于多个变量时,对每个变量的操作都应该由同一个恶锁保护
- 在Android中,工作线程尽量不要和UI线程做同步
重入
锁优化
显示锁
reentrantLock
semaphore
countDownLatch
CyclicBarrier
FutureTask
原子变量和非阻塞算法
Atomic
cas非阻塞算法
性能比较