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讲

    1.死锁:java提供的api:ThreadMXBean 2.trylock的诀窍: 3.synchronized...

  • Java 入门练习(36 - 40)

    JAVA36 判断学生成绩 描述 定义一个方法用于录入学生的考试成绩,要求考试成绩必须在0-100之间,不满足就产...

  • 线程1:线程的创建和基本用法--java36(03/17/201

    线程的简单创建 线程的优先级 线程的方法

  • 讲饮讲食

  • 35讲—36讲

    35讲 如何更有效的学习 学习的金字塔 主要分为:主动学习与被动学习。 金字塔细分: 上部:被动学习:听讲、阅读...

  • 讲什么?如何讲?

    主宰演讲台 作者:比尔*胡戈特伯 讲话,会讲话,会在众人面前讲话,都是一门不小的艺术。清单体存在的意义又一次被强化...

  • 52讲-65讲

    跑步前、中、后的注意事项 影响人生的11个习惯!

  • 该讲 不该讲

    曾经一度悲伤,因为毕业后回到本地。曾经一度不甘,因为屈居这乡土人间。曾经一度愤恨,因为五斗米而弯着腰。曾经一度无趣...

  • 66讲-80讲

    在人生的重要领域开展“主题阅读” 只要你愿意,上帝就会为你开路! 经营弱连接的4个关键!

  • 讲一讲

    我步入工作也8个多月的时间了,回首觉得过得好快,遇到了很多很多事情,有开心的,未知的,尴尬的,伤心的,现在的我不...

网友评论

      本文标题:JAVA36讲

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