JAVA36讲

作者: 蒸汽飞船 | 来源:发表于2018-07-10 23:23 被阅读22次

    1.死锁:
    java提供的api:ThreadMXBean

    2.trylock的诀窍:

    if(lock.tryLock()||lock.tryLock(timeout,unit)){
        //do something
    }
    

    3.synchronized是有monitorenter和monitorexit指令实现的
    锁升级降级就是jvm优化synchronized运行的机制,实现偏斜锁、轻量锁、重量锁的切换
    偏斜锁:擦拭、markword

    4.自旋锁
    其实就是for循环+cas

    for(;;){
      cas
    }
    

    5.java.util.concurrent 包提供的容器Queue、List、Set、Map,从命名上可以大概区分为 Concurrent、CopyOnWrite和 Blocking 等三类,

    6.另一个 BlockingQueue 经常被考察的点,就是是否有界(Bounded、Unbounded),这一点也往往会影响我们在应用开发中的选择,我这里简单总结一下。
    ArrayBlockingQueue 是最典型的的有界队列,其内部以 final 的数组保存数据,数组的大小就决定了队列的边界,所以我们在创建 ArrayBlockingQueue 时,都要指定容量
    LinkedBlockingQueue,容易被误解为无边界,但其实其行为和内部代码都是基于有界的逻辑实现的,只不过如果我们没有在创建队列时就指定容量,那么其容量限制就自动被设置为 Integer.MAX_VALUE,成为了无界队列。
    SynchronousQueue,这是一个非常奇葩的队列实现,每个删除操作都要等待插入操作,反之每个插入操作也都要等待删除动作。那么这个队列的容量是多少呢?是 1 吗?其实不是的,其内部容量是 0。
    PriorityBlockingQueue 是无边界的优先队列,虽然严格意义上来讲,其大小总归是要受系统资源影响。
    DelayedQueue 和 LinkedTransferQueue 同样是无边界的队列。对于无边界的队列,有一个自然的结果,就是 put 操作永远也不会发生其他 BlockingQueue 的那种等待情况。

    类似 ConcurrentLinkedQueue 等,则是基于 CAS 的无锁技术,不需要在每个操作时使用锁,所以扩展性表现要更加优异。

    相对比较另类的 SynchronousQueue,在 Java 6 中,其实现发生了非常大的变化,利用 CAS 替换掉了原本基于锁的逻辑,同步开销比较小。它是 Executors.newCachedThreadPool() 的默认队列。

    相关文章

      网友评论

          本文标题:JAVA36讲

          本文链接:https://www.haomeiwen.com/subject/wzozeftx.html