1.上下文切换
1)上下文切换是指线程间的切换
2)如何减少上下文切换?
a、使用最少线程
b、使用协程,在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
c、无锁并发编程
d、CAS算法
3)多线程一定快吗?
不一定
单核情况下,没有cpu浪费情况下,单线程最快。切换1-2ms
多核情况下,多线程比单线程快。切换不到1ms
4)性能分析工具
Lmbench3
2.死锁
1)锁:加锁后,别的线程不可以再访问,释放后,其他的线程才可以访问。(加锁加的是引用类型)
2)死锁:互相等待对方释放资源
3)如何避免死锁?
a、避免一个线程同事获取多个锁
b、避免一个线程在锁内同时占用多个资源
c、尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制
d、对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况
3.volatile(谁先往回写谁有效,其余都无效)
1)读锁:保证读的正确性
2)用来修饰变量
3)保证可见性,其他线程修改后,该线程原本数据失效,读到其他线程向内存刷新的最新数据,每个处理器通过嗅探在总线上传输的数据来检查自己缓存的值是否过期。
4)两条实现原则
a、锁堆内存,处理器缓存的内存的数据阻止两个或两个以上向回刷新
b、数据写回导致其他处理器缓存无效
5)使用优化(频繁读写)
填充缓存行,把缓存行填充到64字节(32的填充32)
4.synchronized
1)读写锁,保证绝对的安全。
2)用来修饰代码块和方法
5.cpu术语
1)内存屏障:在访问所要访问的功能时,要先去访问另外一块,同意时才可以去访问目的功能。
2)缓冲行:高速缓存的基本单位就是缓存行。只有一条线路,处理器填写缓存线时会加载整个缓存线。
3)原子操作(atomic):不可中断的,要么都成功,要么都失败
4)缓存行填充:64bit,把缓存行填满,就一个数据,想读就读。将经常被访问,没有改变的数据放进一个缓存行中尽可能填满。
5)缓存命中:每次先看高速缓存是否有,有就成为缓存命中,没有就去访问内存。内存读磁盘同样。
6)写命中:修改时高速缓存中存在,直接在高速缓存中进行修改,修改完毕后再写回内存。
7)写缺失:刷新缺失。往回写时,变量不存在了,写缺失。