android 线程那些事

线程和线程安全

线程是什么

  1. 线程为进程的一个实体
  2. 轻量级进程
  3. 是CPU调度和分配的基本单位
  4. 可与同一进程内的线程共享进程内的全部资源
  5. android 进程通过fork创建,线程通过pthread.creat创建

并发的优势促使多线程的出现

  1. 资源利用率 ,提高
  2. 公平性,共享资源
  3. 便利性,多任务并发执行比单任务更容易执行

线程安全

多线程的引入意味着引入了线程安全。当单线程能正确运行的代码,在多线程访问的情况下,不管线程以何种顺序访问,并不添加同步代码都能正确表现行为,则称它为线程安全的

并发的三大要素

原子性

指的是一个或者多个不能再被分割的操作
value = 1; //院子操作
value++; //复合操作

数据竞争

指多进程访问共享资源,不做同步

有序性

可见性

当一个线程对某个变量做出修改时,其他线程可以立刻读取修改后的值

volatile

  1. 是一种稍弱的同步机制,用来确保变量更新操作同步到其他线程,虚拟机不会指令重排
  2. 锁与volatile不同,锁具有两个特性:互斥性和可见性

内置锁

Sychronized关键字

可作用于class和java对象

锁的原理

  1. 锁实现了内存可见性和操作原子性
  2. 释放锁时,该线程的本地内存中的共享变量会被刷新到内存中
  3. 锁不会被继承
  4. 同步代码块是使用monitorenter和monitorexit指令实现的,同步方法是通过ACC_SYNCHRONIZED标识符实现

锁的使用原则

  1. 可能被多个线程同时访问的可变变量,在访问它时都需要持有一个锁,变量由这个锁保护
  2. 每个可变变量都只有一个锁来保护,知道锁的范围
  3. 当锁作用于多个变量时,对每个变量的操作都应该由同一个恶锁保护
  4. 在Android中,工作线程尽量不要和UI线程做同步

重入

锁优化

显示锁

reentrantLock
semaphore
countDownLatch
CyclicBarrier
FutureTask

原子变量和非阻塞算法

Atomic
cas非阻塞算法
性能比较

https://segmentfault.com/l/1500000012849264/play