android多线程总结

本文总结了线程同步的各种技术,包括volatile、CAS、atomic、synchronized和lock的适用场景,使用流程,以及线程池的最佳实践,重点讲解了wait/notify的使用注意事项和异常处理策略。
摘要由CSDN通过智能技术生成

线程同步对应的方案总结:


1 适用范围

可见性:volatile 适用范围:比如状态值,简单的 写,读,synchronized 适应所有可见性的情况
原子性:atomic包,cas算法,synchronized,lock 适用范围:比如一些复杂的++ -- 对象赋值等操作
有序性,都能保证(volatile,atomic,synchronized,lock等等)

2 使用流程:

volatile>cas>atomicStampreference>synchronized,lock

cas有aba问题,大于两个以上的线程建议用atomicStampreference
synchronized 底层通过虚拟机保证只有一个线程执行保证了原子性,通过内存屏障(就是进入屏障的,都要写入主内存,都要必须不重排)
来保证有序性,可见性,这点和volatile是一样的(内部流程,先偏向锁,就是同一个线程访问无需枷锁,然后cas,然后重型锁,但是呢,他是超时后才转换,
转换不够灵活,我们还是自己选择的好)


3 线程池相关的


单线程池和有限线程池队列是无限制,会导致oom
cached 和scheduled 线程池线程量无限制,会导致oom,
排队队列可以选 有限,无限,双端等队列,拒绝策略有 报错,丢弃,替换最后一个队列的任务等等
最好给一个公用的异常处理策略
1 给每个线程添加异常处理类
threadFactory(线程工厂)。这是用来创建线程的工厂,这里可以创建thread的时候添加异常处理
返回一个setUncaughtExceptinHandler的thread类
2 给所有线程添加异常处理类

4  wait,notify,join


这里主要记录下一些使用范例:
1 获得锁后,仍然需要重新检查下条件
synchronized(对象){
    while(条件不满足){
        对象.wait();
    }
    对应的处理逻辑
}
另外尽量用notifyall(notify是给一个wait线程走,notifyall是所有wait的退出后,从新while判断条件后走)
2 一定要明确锁加在了哪个对象上,不然默认加在当前对象,容易导致同步操作无效或
IllegalMonitorStateException: object not locked by thread before notify
这个在异步加载中用到过,就是放到了子线程来初始化一部分耗时操作,此期间不能访问(wait),当时用的是默认的 notify
导致一系列问题,所以要明确notify,wait的对象,要用object.wait,object.notifyall才行
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值