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

  • 相关阅读:
    重学Java 面向对象 之 final
    java并发学习04---Future模式
    java并发学习03---CountDownLatch 和 CyclicBarrier
    java并发学习02---ReadWriteLock 读写锁
    java并发学习01 --- Reentrantlock 和 Condition
    链表的倒数第k个节点
    重建二叉树
    java并发学习--线程池(一)
    二叉树的深度
    vue-常用指令(v-for)
  • 原文地址:https://www.cnblogs.com/wcgstudy/p/11525351.html
Copyright © 2020-2023  润新知