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 的设计思路

猜你喜欢

转载自www.cnblogs.com/wcgstudy/p/11525351.html