《Java高并发程序设计》读书笔记

本文是关于一本涵盖Java并发各方面及扩展知识书籍的读后感。作者收获两点,一是了解并发类使用注意点,二是对JDK并发类原理有更清晰认识。还总结了volatile特性、锁相关知识、线程池方法区别等重要知识点,以及一些并发工具和框架的研究。

一、读后感

这书内容基本涵盖了java并发的方方面面,也扩展并发之外的java知识。并发内容包括并发原理、并发编程基础、JDK并发包、锁优化,扩展内容讲解了java8函数式编程以及高并发框架Akka。我觉得这本书给我最大的收获有两点:

  1. 提醒了我使用并发类有哪些地方是要注意的。比如说wait/notify方法必须要加锁后才能使用,调用notify方法后也需要获得锁才会运行。
  2. 让我JDK的并发类的原理有了较清晰的认识。其实看完这本书就想对完全掌握Doug Lea大神写的并发包,那是不可能的。但是读完这本书后再去研究jdk并发包的源码会轻松很多。没错,下阶段目标就是jdk并发包源码研究。

二、我觉得需要注意的知识点

  1. volatile在可见性和有序性发挥作用,不保证原子性。
  2. Integer对象加锁然后++会不安全,Integer每次相加会另外创建对象。
  3. LockSupport阻塞时可以被中断方法唤醒,重入锁的阻塞是LockSupport实现的,所以重入锁也可以被中断。但是LockSupport中断后不会清除中断状态,而sleep方法会清除。另外locksupport不需要加锁使用。
  4. condition.await会释放锁,当唤醒需要重新获得锁,signal方法唤醒线程。
  5. suspend方法在堆栈中依然看到是Runnable状态,不能查看阻塞情况。
  6. 画线程池类图
  7. 并发,阻塞队列研究
  8. execute和submit方法的区别,execute会抛出异常,submit直接吃掉异常。execute只能提交ruunable,submit还可提交Callable。execute是接口方法。submit是ExecuteService的方法。
  9. 读写锁,只有写写是同步加锁的,读写不加锁
  10. 锁优化:减少锁持有时间,减小锁粒度,读写分离锁,锁分离(LinkedBlockingQueue),锁粗化(多个连续的锁整合成一个,减少多锁获取释放的损耗)。
  11. 虚拟机锁优化
    1)锁偏向,同一个线程获得锁后可以多次获得锁,如果多次都是不同的线程申请锁资源,则偏向锁失效。开启偏向锁:-XX:+UseBiasedLocking
    2)轻量级锁。这个不是很懂
    3)自旋锁。当申请锁失败时不是立刻挂起,而是空循环看是否可以获得。
    4)锁消除。虚拟机判断锁是否有必要加,如果没有就去除。例子Vector。p147
    需要打开逃逸分析:-XX:+DoescapeAnalysis
    锁消除:-XX:+EliminateLocks
  12. 研究ThreadLocal,其实是每个Thread内部都有一个ThreadLocalMap,而ThreadLocalMap内部的table存储了key为ThreadLocal,value为对应值的Entry。其中Entry是弱引用,当对应的强引用key被回收bbbbbbbbbb时,value可能被回收b
  13. SynchronousQueue 原理研究。
  14. 避免死锁:使用无锁函数(天生对死锁免疫),使用重入锁(中断,和限时等待)
  15. 不可变对象,完全不用考虑并发读的问题。String,还有基本类型的包装类
  16. 无锁队列ConcureentLinkedQueue使用cas操作,而BlockingQueue使用加锁和阻塞,第一个性能好点
  17. Disruptor框架。环形队列,cas操作,内存复用,固定大小,不需要空间分配和回收
  18. 研究java的future模式
  19. lambda表达式的使用。LongAdder(使用-XX:-RestrictContended开启解决伪共享)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值