一、读后感
这书内容基本涵盖了java并发的方方面面,也扩展并发之外的java知识。并发内容包括并发原理、并发编程基础、JDK并发包、锁优化,扩展内容讲解了java8函数式编程以及高并发框架Akka。我觉得这本书给我最大的收获有两点:
- 提醒了我使用并发类有哪些地方是要注意的。比如说wait/notify方法必须要加锁后才能使用,调用notify方法后也需要获得锁才会运行。
- 让我JDK的并发类的原理有了较清晰的认识。其实看完这本书就想对完全掌握Doug Lea大神写的并发包,那是不可能的。但是读完这本书后再去研究jdk并发包的源码会轻松很多。没错,下阶段目标就是jdk并发包源码研究。
二、我觉得需要注意的知识点
- volatile在可见性和有序性发挥作用,不保证原子性。
- Integer对象加锁然后++会不安全,Integer每次相加会另外创建对象。
- LockSupport阻塞时可以被中断方法唤醒,重入锁的阻塞是LockSupport实现的,所以重入锁也可以被中断。但是LockSupport中断后不会清除中断状态,而sleep方法会清除。另外locksupport不需要加锁使用。
- condition.await会释放锁,当唤醒需要重新获得锁,signal方法唤醒线程。
- suspend方法在堆栈中依然看到是Runnable状态,不能查看阻塞情况。
- 画线程池类图
- 并发,阻塞队列研究
- execute和submit方法的区别,execute会抛出异常,submit直接吃掉异常。execute只能提交ruunable,submit还可提交Callable。execute是接口方法。submit是ExecuteService的方法。
- 读写锁,只有写写是同步加锁的,读写不加锁
- 锁优化:减少锁持有时间,减小锁粒度,读写分离锁,锁分离(LinkedBlockingQueue),锁粗化(多个连续的锁整合成一个,减少多锁获取释放的损耗)。
- 虚拟机锁优化
1)锁偏向,同一个线程获得锁后可以多次获得锁,如果多次都是不同的线程申请锁资源,则偏向锁失效。开启偏向锁:-XX:+UseBiasedLocking
2)轻量级锁。这个不是很懂
3)自旋锁。当申请锁失败时不是立刻挂起,而是空循环看是否可以获得。
4)锁消除。虚拟机判断锁是否有必要加,如果没有就去除。例子Vector。p147
需要打开逃逸分析:-XX:+DoescapeAnalysis
锁消除:-XX:+EliminateLocks - 研究ThreadLocal,其实是每个Thread内部都有一个ThreadLocalMap,而ThreadLocalMap内部的table存储了key为ThreadLocal,value为对应值的Entry。其中Entry是弱引用,当对应的强引用key被回收bbbbbbbbbb时,value可能被回收b
- SynchronousQueue 原理研究。
- 避免死锁:使用无锁函数(天生对死锁免疫),使用重入锁(中断,和限时等待)
- 不可变对象,完全不用考虑并发读的问题。String,还有基本类型的包装类
- 无锁队列ConcureentLinkedQueue使用cas操作,而BlockingQueue使用加锁和阻塞,第一个性能好点
- Disruptor框架。环形队列,cas操作,内存复用,固定大小,不需要空间分配和回收
- 研究java的future模式
- lambda表达式的使用。LongAdder(使用-XX:-RestrictContended开启解决伪共享)
本文是关于一本涵盖Java并发各方面及扩展知识书籍的读后感。作者收获两点,一是了解并发类使用注意点,二是对JDK并发类原理有更清晰认识。还总结了volatile特性、锁相关知识、线程池方法区别等重要知识点,以及一些并发工具和框架的研究。
357

被折叠的 条评论
为什么被折叠?



