java高并发学习-死锁(一)
死锁发生的必要条件:
1、互斥条件
2、请求和保持条件
3、资源不剥夺条件
4、环路等待条件
多线程的最佳并发实践;
1、 使用本地变量
2、使用不可变类
3、最小化锁的作用域范围 : S = 1/(1-a+a/n) (阿木达尔定律)
其中,a为串行计算部分所占比例,n为并行处理结点个数。这样,当a=0时,最大加速比s=n;当a=1时,最小加速比s=1;当n→∞时,极限加速比s→ 1/a,这也就是加速比的上限。例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。这一公式已被学术界所接受,并被称做“阿姆达尔定律”(Amdahl law)。
4、使用线程池的Executor,而不是使用new Thread();
5、宁可使用同步也不要使用wait()和notify()
6、使用blockingQueue实现生产者消费者模式
7、使用并发结合而不是加了锁的同步集合
8、使用semaphore创建有界的访问
9、宁可使用同步代码块,也不要使用同步的方法
10、避免使用静态变量
hashmap和concurrenthashmap
hashmap 最终要的两个参数是加载容量和扩容因子。
当当前使用内存超过加载容量和扩容因子的乘积的时候,就会对hashmap进行扩容,在扩容的过程中并不是线程安全的,在并发调用的时候,可能出现死循环。
concurrenthashmap1.7版本和1.8版本的区别是1.8引入了红黑树,当链表数量超过8的时候,就会触发红黑树,红黑树的寻址时间是o(logn),而链表的寻址时间是o(n)
缓存学习:
命中率 = 命中数/(命中数+未命中数)
最大元素空间:
缓存清空策略: FIFO、LFU、LRU、过期时间、随机等
业务场景和业务需求: 缓存适合读多写少的应用场景
Guava cache : 继承了concurrenthashmap 的设计思路