# readbook **Repository Path**: helllp/readbook ## Basic Information - **Project Name**: readbook - **Description**: 这里是我的读书笔记 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-01-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # readbook 这里是我的读书笔记,我不会一本书从头看到尾,会同时看几本书。有些书的某些章节我会结合着看,针对某一个专题几本书同时看,相互印证。 我信奉一个理论,书要先看薄(提取去知识要点),然后再看厚(可以触类旁通)。 这些笔记都是看书的时候记录,然后整理出来发布的。 ## 深入理解Java虚拟机JVM高级特性与最佳实践(周志明) 书籍的测试代码目录:me.helllp.book.jvm - 第一部分:走进Java,第一章 1. 这一部分都是一些介绍,对Java有一个全局的认识。可以不用太在意。 2. 可以了解一下多核并行,进行一下JDK源码编译。 3. [OpenJDK编译](https://www.jianshu.com/p/89061400391a) - 第二部分:自动内存管理机制,第二、三、四、五章 1. [简述Java垃圾回收](https://www.jianshu.com/p/bad434203ea2) - 第三部分:虚拟机执行子系统,第六、七、八、九章 1. 虚拟机执行 - 第四部分:程序编译与代码优化,第十、十一章 - 第五部分:高效并发,第十二、十三章 ## Java高并发程序设计(葛一鸣,郭超) 数据的测试代码目录:me.helllp.book.concurrency - 第一章:走入并行世界,应用程序改造为并行模式运行。 同步和异步的差别 并发与并行的区别 临界区表示公共资源和共享数据 阻塞与非阻塞(对临界区的等待) 死锁,饥饿和活锁 并发级别:阻塞,无饥饿(公平调度),无障碍,无锁,无等待 Java JMM模型:原子性,可见性,有序性(指令重排序), - 第二章:Java并行程序基础 多线程概念 线程的状态 线程的中断:是一种协调机制 等待和通知(wait,notify),必须与synchronized配合使用 - 第三章:JDK并发包 - ReenterLockDemo 重入锁的演示 - TimeLock 重入锁的等待 - IntLock 通过重入锁的中断进行解锁处理 - ReenterLockCondition 重入锁配合Condition - SemapDemo 信号量的使用 - ReadWriteLockDemo 读写锁的使用 - CountDownLatchDemo 倒数阀门的使用 - CyclicBarrierDemo 循环珊栏的使用 - LockSupportDemo 线程阻塞工具类 LockSupport - ThreadPoolDemo 线程池的使用例子 - ScheduledExecutorServiceDemo 周期任务线程池 - RejectThreadPoolDemo 自定义线程池拒绝策略 - ExtThreadPool 对线程池进行扩展 - TraceThreadPoolExecutor 输出线程池错误堆栈 - CountTask Fork/Join模型 - 第四章:锁的优化及注意事项 注意事项: 1. 减少锁的持有时间 2. 减小锁的粒度 3. 使用读写分离来替代独占锁 4. 使用锁分离,例如:LinkedBlockingQueue 5. 锁粗化:在连续对同一把锁进行请求和释放的时候,应该合并为一把锁,最典型的例子:锁加在循环外,不在循环内 虚拟机的优化 1. 锁偏向:线程获取锁后进入偏向模式,再次获取锁的时候,不需要进行同步操作。-XX:+UseBasedLocking 2. 轻量锁:在偏向锁失败后,不会立刻挂起线程,而是进入轻量锁,可能快速进入临界区,如果加锁不成功则膨胀为重量锁 3. 自旋锁:在真正挂起线程之前,空转几个CPU时钟周期,如果可以获得锁,则进入临界区,避免线程的挂起 4. 锁消除:虚拟机去除不必要的锁,必须在服务器模式下 -server 5. ThreadLocal 无锁的处理 1. CAS,使用AtomicStampedReference解决ABA问题 2. atomic工具 3. Unsafe类:sun.misc.Unsafe 4. 普通变量变为原子操作:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater 5. 线程之间数据交换: 程序: - ThreadLocalDemoGC 测试ThreadLocal的GC回收 - RandomTask 验证ThreadLocal的功能 - CasAbaDemo 使用AtomicStampedReference解决ABA问题 - AtomicIntegerFieldUpdaterDemo AtomicIntegerFieldUpdater的使用方法 - DeadLock 死锁的演示 - 第五章:并行模式与算法 - 不变模式:回避了多线程并发访问的状态问题 - 生产者-消费者模式:通过共享内存缓冲区避免直接通讯,可以使用BlockingQueue实现 - 无锁缓存框架:Disruptor - CPU Cache优化,Disruptor的Sequence - Future模式 - StaticSingleton 好的单例模式 - ProviderConsumerDemo 演示生产者和消费者模型 - DisruptorDemo 使用Disruptor作为缓冲区实现生产者-消费者模式 - FutureClient 演示Future模式 - JdkFutureDemo JDK框架的Future演示 - PStreamMain 并行任务进行计算:(A+B)*A/2 - SearchTask 并行查找的演示 - BubbleOrderDemo 奇偶交换排序并行演示,比较冒泡排序 - ShellOrderDemo 希尔排序并行算法演示 - 第六章:Java8与并行 - 函数式编程简介 ## Netty权威指南(李林峰) me.helllp.book.netty - step00:阻塞式IO,改进使用线程池 - step01:模拟回调 - step02:Future的使用 - step03:Netty进行Nio的编写 - step05:AIO的例子 - step06:Netty解决粘包问题 - step07:使用Java的序列化进行对象传递 - step08:使用谷歌protobuf进行序列化 ## Java性能优化权威指南 me.helllp.book.performance 性能优化首先是进行监控,获取运行中的状态 操作系统性能监控 1. CPU使用率:vmstat,mpstat,top 用户态CPU使用率 系统态CPU使用率 2. 内存使用量: free 3. 锁竞争:pidstat -w 列出的cswch/s表示让步式上下午切换 4. 监控线程迁移:通过创建处理器组,将Java应用程序分配给处理器组。如果每秒超过500次,通常可以分配处理器组 5. 网络监控: netstat 网络IO的饱和度,nicstat,需要下载编译安装 6. IO监控:iostat -xm 7. 其他命令:sar ## 机器学习实战 监督学习:有输入,有预期的输出的情况下 标称型和数值型(主要用于回归) 分类算法: 术语: 特征值,目标变量 解决的问题: 分类,回归(监督学习),这类算法必须知道预期的是什么 k-近邻算法 线性回归 朴素贝叶斯 局部加权线性回归 支持向量机 Ridge回归 决策树 Lassso最小回归系数估计 无监督学习 K-均值 最大期望算法 DBSCAN 步骤: 1. 收集数据 2. 准备输入数据 3. 分析输入数据 4. 训练算法 5. 测试算法 6. 使用算法 k-近邻算法: 有监督,分类算法 也叫kNN算法 算法描述:每一个样本都有自己的类别,新数据需要计算与每一个样本的距离,选择距离最近的前k个样本,出现次数最多的分类作为新数据的分类 归一化数值,数据修改到0,1之间,通过比例可以达到这个效果 决策树: 有监督,分类算法 可能产生过度匹配的问题 核心:信息论划分数据集,香浓熵的计算 朴素贝叶斯: 通过概率做出最优类别预测 有监督,分类算法,选择概率高的作为、 条件概率的计算法则 使用 1. 概率乘积来解决,避免出现0的乘法 2. 避免下溢,使用log解决 3. 准备数据:文档词袋模型,词集模型 Logistic回归 最优化算法,用于分类 基于Logistic回归和Sigmoid函数(神经网络阈值函数)进行分类,将变量映射在0,1之间 梯度上升最优化算法 在线学习方法 支持向量机 SVM:支持向量机,有很多种实现,序列最小优化算法(SMO) 线性可分,超平面作为分类的决策边距 ## 统计学习方法 统计学习:计算机基于数据构建概率统计模型并运用模型对数据进行预测和分析的一门科学 基本假设:同类数据具有一定的统计规律性,这是统计学习的前提 模型假设空间,模型选择准则,模型学习的方法 模型,策略,算法 条件概率和决策函数 一次测量的好坏:损失函数 ## Redis实战 五种数据类型:字符串,列表,集合,散列,有序集合 订阅/发布机制,主从复制,持久化,脚本 字符串: Redis主从链 事物中的错误类型: 1. 语法错误:存在语法错误的语句,所有的语句都不执行 2. 运行错误:如果出现语句运行错误,则正确的语句都会被执行 MULIT/EXEC 保证执行的原子性 WATCH 保证 Redis的使用: 构建应用的支持:日志处理,统计处理,配置管理 构建应用的组件: 高级使用: 短结构,列表,散列,集合,有序集合提供了一组配置选项。以节约空间的方式存储长度比较短的结构,称为短结构 压缩列表的方式! 分片结构,可以和短结构共同构成降低内存消耗的系统 打包储存二进制位和字节 扩展Redis 性能提升的途径: 1. 使用短结构,提升内存是使用效率 2. 选择正确的数据结构 3. 大对象先进行压缩 4. 使用流水线和连接池 5. 使用读从服务器 Redis实现和设计 1. 简单动态字符串: Redis HyperLogLog 是用来做基数统计的算法 GEO类型:地理位置:3.2版本,3.2版本里面新增的一个功能就是对GEO(地理位置)的支持 Redis Modules System是4.0出现一大改动点,通过外部模块对redis进行功能扩充 Redis ML 进行机器学习 https://mp.weixin.qq.com/s/GT_19hhJR-PrXWN9Hs9Jvg Redis的分布式锁方案: