《Java并发编程的艺术》读书笔记
一、并发编程的挑战
上下文切换:cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
如何减少上下文切换:
无锁并发编程
cas算法
使用最少线程
协程
避免死锁:
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况
二、Java并发机制的底层实现原理
volatile:
是轻量级的synchronized
当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值
它不会引起线程上下文的切换和调度
volatile的实现原则:
Lock前缀指令会引起处理器缓存写回到内存,同时缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据
一个处理器的换成回写到内存会导致其他处理器的缓存无效
通过使用LinkedTransferQueue(追加了字节)来提高队列的出入队效率
Java中锁的3种形式:
对于普通同步方法,锁是当前实例对象
对于静态同步方法,锁是当前类的Class对象
对于同步方法块,锁是Synchonized括号里配置的对象
synchronized: