Java
文章平均质量分 80
在咖啡里溺水的鱼
选择了它,就要爱它。充满激情,全神贯注。
展开
-
Java进阶之路【代码篇】——《CleanCode》编程规则精编(1)命名
阅读本文之前请确保你已与我达成共识。即,代码是一门讲规矩的艺术。前一段时间因为要参加一个有关重构的培训,匆匆读完了《CleanCode》一书,参加完培训后看到之前的读书笔记,发现又有了一番新的认识,因此在此加以总结。希望能够与愿意把代码当成一件艺术品去精心打磨的同学们一起来学习和研究如何把代码写的“优雅”。 简洁优秀的代码的好处不需更多的解说,但如何写出“优雅”的代码,还需要在个人的实践中仔细的体原创 2017-05-01 23:11:58 · 1069 阅读 · 0 评论 -
深入理解JVM——Java内存区域与内存溢出异常
本文为 《深入理解Java虚拟机》第二章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界个人练习代码:h...原创 2018-06-13 22:25:44 · 301 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》14.构建自定义的同步工具
虽然章节的目的是介绍如何基于AQS等基类来构建自定义的同步工具,但详细的介绍了AQS的原理,并且详细的讲解了java.util.concurrent类库中许多基于AQS的常用同步工具对AQS的实现及原理。了解AQS之后对ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWritLock、FutureTask都会有一个全新的认识和豁然开朗的...原创 2018-04-23 23:42:19 · 715 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》13.显式锁
需要支持轮询、定时的锁?需要可中断锁获取操作的锁?在非块结构中想要使用锁?了解支持更高级操作的显式锁。Java 5.0新增ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选的高级功能。13.1 Lock与ReentrantLockReentrantLock实现了Lock接口,提供了与synchronized相同的互斥性和内存...原创 2018-04-23 23:38:05 · 279 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》12.并发程序的测试
本章节的内容介绍了如何对并发程序进行测试,与普通程序进行测试的区别,测试过程中应当注意的问题,可以使用的技巧和方法等12.1 正确性测试在为并发类设计单元测试时,首先需要执行与测试串行类时相同的分析——找出需要检查的不变形条件和后验条件。12.1.1 基本的单元测试进行并发程序测试时,包含一组串行测试通常是有帮助的,它们有助于在开始分析数据竞争之前就找出与并发性无关的问...原创 2018-04-23 23:35:56 · 339 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》11.性能与可伸缩性
本章内容介绍了并发编程中,最吸引人的性能问题。什么会导致性能问题,如何解决性能问题,我们应该在什么情况下着手解决性能问题?首先要保证程序能正确运行,然后仅当程序的性能需求和测试结果要求程序执行的更快时,才应该设法提高它的运行速度11.1 对性能的思考尽管使用多个线程的目标是提升整体性能,但与单线程的方法相比,使用多个线程总会引入一些额外的性能开销。要想通过并发来获得更好...原创 2018-04-23 23:34:13 · 264 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》10.避免活跃性危险
死锁是并发编程中最容易遇到的活跃性问题,本章就死锁发生的原因、诊断、避免死锁的方案进行了细致的解读。10.1 死锁在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这两个线程将永远的等待下去。这种情况是最简单的死锁形式,称为 抱死 Deadly Embrace。数据库系统的设计中考虑了检测死锁以及从死锁中恢复。当检测到一组事务发生了死锁时,将选择一个牺牲者并...原创 2018-04-23 23:31:48 · 441 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》8.线程池的使用
8.1 在任务与执行策略之间的隐性耦合虽然Executor框架为指定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。有些类型的任务需要明确的指定执行策略:依赖性任务如果提交给线程池的任务需要依赖其他任务,那么就隐含的给执行策略带来了约束。此时必须小心的维持这些执行策略以避免产生活跃性问题。使用线程封闭机制的任务单线程的Executor能够对...原创 2018-03-25 14:07:56 · 318 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》7.取消与关闭
Java没有提供任何机制来安全的终止线程。(Thread.stop 和 suspend 等方法存在着一些严重缺陷,应该避免使用)。但它提供了中断 Interruption,中断是一种协作机制,能够使一个进程终止另一个进程的当前工作。一个行为良好的软件与勉强运行的软件之间的最主要区别就是,行为良好的软件能很完善的处理失败、关闭和取消等过程。7.1 任务取消如果外部代码能在某个操作正常...原创 2018-03-25 13:47:33 · 362 阅读 · 0 评论 -
深入了解JVM——虚拟机性能监控与故障处理工具
本文为 《深入理解Java虚拟机》第四章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界个人练习代码:h...原创 2018-07-23 22:25:30 · 260 阅读 · 0 评论 -
【知识精解】Java8中的Lambda表达式
知识精解系列将以博主的第一视角对各类技术中的核心要点进行深入的解析,不会覆盖相关技术的全部内容,适合想要快速了解相关技术核心内容的人群阅读。 本文为 《Java8函数式编程》(Java 8 Lambdas: Functional Programming for the Masses) 第二章内容的精解,若对相关知识感兴趣,想要全面的学习相关知识,推荐购书深入阅读。若认为文章涉嫌侵权...原创 2018-08-20 22:20:38 · 412 阅读 · 0 评论 -
深入了解JVM——运行期优化
本文为 《深入理解Java虚拟机》第十一章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界概述JIT...原创 2018-08-20 21:29:39 · 322 阅读 · 0 评论 -
深入了解JVM——编译器优化
本文为 《深入理解Java虚拟机》第十章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界概述Java...原创 2018-08-20 21:28:25 · 318 阅读 · 0 评论 -
深入了解JVM——虚拟机字节码执行引擎
本文为 《深入理解Java虚拟机》第八章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界概述执行引擎...原创 2018-08-20 21:26:32 · 275 阅读 · 0 评论 -
深入了解JVM——虚拟机类加载机制
本文为 《深入理解Java虚拟机》第三章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界概述虚拟机的...原创 2018-08-20 21:23:24 · 240 阅读 · 0 评论 -
深入了解JVM——类文件结构
本文为 《深入理解Java虚拟机》第四章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界无关性的基石...原创 2018-08-20 21:21:12 · 209 阅读 · 0 评论 -
深入了解JVM——虚拟机性能监控与故障处理工具
本文为 《深入理解Java虚拟机》第四章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界JDK的命令行工...原创 2018-08-20 21:17:10 · 202 阅读 · 0 评论 -
深入了解JVM——垃圾收集器与内存分配策略
本文为 《深入理解Java虚拟机》第二章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。 本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。 开源创造世界个人练习代码:h...原创 2018-07-23 22:27:34 · 307 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》学习笔记 6.任务执行
大多数并发应用程序都是围绕 任务执行 Task Execution 来构造的:任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。6.1 在线程中执行任务当围绕 任务执行 来设计应用程序结构时,第一步就是要找出清晰的任务边界。在理想情况下,各个任务之间是...原创 2017-11-27 18:15:10 · 420 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 并发技巧清单
并发技巧清单可变状态是至关重要的 所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。尽量将域声明为final类型,除非需要它们是可变的不可变对象一定是线程安全的 不可变对象能极大的降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无需使用加锁或保护性复制等机制。封装有助于管理复杂性 将数据封装在对象中,更易于维持不变性条件:将同步机制封...原创 2017-11-27 18:14:34 · 279 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(10) 并发
并发并发的意义分离 做什么 与 何时做并发防御原则单一权责限制数据作用域使用数据副本线程应尽可能独立了解类库的线程安全性了解执行模型生产者-消费者读者-作者宴席哲学家警惕同步方法之间的依赖保持同步区域微小尽早考虑关闭问题编写线程测试代码将伪失败看做可能的线程问题先使非线程代码可工作编写可插拔的线程代码编写可调整的线程代码运行多于处理器数量的线程在不同平台上运行装置试错原创 2017-08-22 22:04:55 · 374 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(9) 系统、迭进
系统将系统的构造与使用分开分解main使用工厂模式实现延迟加载依赖注入合理使用代理借助于AOP实现面向切面编程书中翻译为 面向方面,我认为还是 面向切面 更形象一些AspectJ是实现面向切面编程的有力工具测试驱动系统架构不认同迭进简单设计的几条规则运行所有测试重构不合适的设计不可重复提高代码表达力尽可能少的类和方法原创 2017-08-22 22:03:46 · 353 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(8) 类
类应该短小单一职责 SRP 类或模块应该有且只有一条加以修改的理由 即类应当只做一类事情内聚 类应该只有少量实体变量。类中的每个方法都应该操作一个或多个这种变量。保持内聚就会得到许多短小的类使用接口与抽象类来隔离修改原创 2017-08-22 22:03:01 · 450 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(7) 边界、单元测试
边界作者的核心思想就是,使用 学习型测试代码,测试第三方类库的正确性的同时学习该类库的使用方法更多的操作技巧,则是使用适配器、代理等模式。单元测试作者推崇的TDD(测试驱动开发)我个人认为在WEB开发中使用较少,因此有关TDD的内容仅作记录,并不支持。TDD三定律在编写不能通过的单元测试前,不可编写生产代码只可编写刚好无法通过的单元测试,不能编译也算不通过只可编写刚好足以通过当前失败测试的生产原创 2017-08-22 22:01:36 · 460 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(6)错误处理
使用异常而非返回某种标识码先写try-catch-finally语句使用不可控异常 可控异常的代价是违反开放/闭合原则。如果在方法中抛出可控异常,而catch语句在多个层级之上,就得在catch语句和抛出异常处之前的每个方法签名中声明该异常。这意味着对软件中较底层的修改,都将波及较高层的签名给出异常发生的环境说明 记录日志自定义合适的异常定义常规流程 将业务逻辑与异常处理代码做出良好原创 2017-08-22 22:00:05 · 519 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(5)对象和数据结构
对象和数据结构数据抽象使用合适的模型去抽象数据eg// badpublic class Point { public double x; public double y;}// goodpublic interface Point { private double x; private double y; private Point() {原创 2017-08-22 21:58:19 · 364 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(3)注释
来自CleanCode原书中的一句话,告诉了我们注释的核心原则。 别给糟糕的代码加注释——重新写吧注释不能美化糟糕的代码,能用代码说明的问题,就不要用注释来说明。 《CleanCode》这本书作为Java的必读书目之一,关于注释的这个观点却还是有许多人都不明白。甚至某些公司对于注释有着某些变态的格式要求,我真的是只能抱之以呵呵。如果看函数名就能明白函数的功能的话,那你再把函数名解释成中文写出原创 2017-08-07 21:55:28 · 471 阅读 · 0 评论 -
Java进阶之路【代码篇】——《CleanCode》编程规则精编(2)函数
函数命名使用描述性的名称。 函数又称为方法,其目的是要完成一项功能。命名应该能够描述出这件事。大小要短小。肉眼可见的量化标准是: - 不长于一屏 - 缩进层级不高于2层功能要符合单一职责原则。面向对象SOLID原则之一。一个函数只做一件事情,没有副作用。分隔指令与询问。要么询问一件事,要么命令一件事。也是单一职责的一种体现每个函数中的内容保持在同一抽象层级错误的抽象层级:public原创 2017-07-31 21:34:01 · 540 阅读 · 0 评论 -
Clean Code 代码整洁之道 - 编码坏味道
注释不恰当的注释废弃的注释冗余的注释糟糕的注释注释掉的代码环境需要多步才能实现的构建需要多步才能做到的测试函数过多的参数输出参数标识参数死函数一般性问题一个源文件中存在多种语言明显的行为未被实现(违反 最小惊异原则 The Principle of Least Surprise)不正确的边界行为忽视安全重复在错误的抽象层级上的代码基类依赖于派生类信息过多原创 2017-08-22 22:05:43 · 843 阅读 · 0 评论 -
开发日志 2017年8月31日
今日任务解决Java客户端连接Hbase的问题日志2017年8月31日10:27:09使用Ambari下载的hbase-site.xml作为配置文件运行测试类 @Test public void test2() { try { Configuration conf = HBaseConfiguration.create();原创 2017-08-31 23:12:31 · 2080 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》学习笔记 5.基础构建模块
5.1 同步容器类同步容器类包括Vector、Hashtable,以及JDK1.2中添加的一些功能相似的类,这些同步的封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态。(但这些类基本都被淘汰了)5.1.1 同步容器类的问题同步容器类都...原创 2017-11-27 18:13:45 · 334 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 4.对象的组合
4.1 设计线程安全的类通过使用封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。再设计线程安全类的过程中,要包含的三个基本要素: - 找出构成对象状态的所有变量 - 找出约束状态变量的不变性条件 - 建立对象状态的并发访问管理策略分析对象的状态时,首先从对象的域开始。如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态。如果在对象...原创 2017-11-27 18:13:04 · 283 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 3.对象的共享
3.1 可见性在没有同步的情况下,编译器、处理器以及运行时都可能对操作的执行顺序进行一些意想不到的调整。因为它们会对代码的执行顺序进行“重排序”。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。 重排序 重排序指的是编译器和处理器为了优化程序性能而对指令序列进行重新排序的手段 重排序主要分为两类:编译器优化的重排序、指令级别并行的重排...原创 2017-11-27 18:12:20 · 408 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 2.线程安全性
概述如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题: - 不在线程之间共享该状态变量 - 将状态变量修改为不可变的变量 - 在访问状态变量时使用同步Java语言没有强制要求将状态都封装在类中,然而,程序状态的封装性越好,就越容易实现程序的线程安全性。在某些情况中,良好的面向对象设计技术与实际情况的需求并不一致。在这些情...原创 2017-11-27 18:11:21 · 286 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 1.简介
1.1 并发简史线程也被称为轻量级进程。在大多数现代操作系统中,都是以线程为基本的调度单位,而不是进程。1.2 线程的优势发挥多处理器的强大能力简化建模的复杂度简化异步事件的处理使用户界面响应的更加灵敏1.3 线程带来的问题安全性问题活跃性问题 —— 某件正确的事情最终会发生性能问题1.4 线程无处不在框架通过在框架线程中调用应用程序代码将...原创 2017-11-27 18:10:21 · 257 阅读 · 0 评论 -
《重构-改善既有代码的设计》知识精选——代码坏味道
章节三 代码的坏味道*这一部分的内容最好在CHM文件中去阅读Duplicated Code (重复代码)同一个class内的两个函数含有相同表达式(expression)采用Extract Method提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。两个互为兄弟〔sibling)的subclasses内含相同表达式对两个classes都使用Extract Method,然后再对被提炼原创 2017-09-03 11:55:22 · 552 阅读 · 0 评论 -
《重构-改善既有代码的设计》知识精选——重构方法合集
重新组织函数Extract Method(提炼函数)有一段代码可以被组织在一起并独立出来。将一段代码放进一个独立函数中,并让函数名称解释该函数的用途。 创造一个新函数,根据这个函数的意图来给它命名(以它「做什么」来命名, 而不是以它「怎样做」命名)。Inline Method(将函数内联化)一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂。在函数调用点插入原创 2017-09-03 11:53:03 · 420 阅读 · 0 评论 -
《重构-改善既有代码的设计》知识精选——认识重构
章节一 重构,第一个案例重构的第一步测试过程中很重要的一部分,就是测试程序对于结果的回报方式。它们要不说 “OK”,表示所有新字符串都和参考字符串一样,要不就印出一份失败清单,显示问题字符串的出现行号。这些测试都属于自我检验(self-checking)。是的,你必须让测试有能力自我检验,否则就得耗费大把时间来回比对,这会降低你的开发速度。 TIP:重构之前,首先检查自己是否有一套可靠的测试机制原创 2017-09-03 11:51:19 · 384 阅读 · 0 评论 -
SpringBoot项目 - Maven Build Lombok 报错
先抛结论被Lombok @Builder 和 @UtilityClass 修饰的类成员变量不能通过 import static 方式引入。今天遇到了一个很诡异的问题,一个SpringBoot项目,突然在某次提交之后Maven编译就开始报错了。报错信息通篇是找不到那些标记了@Data的类所自动生成的 Getter方法和Setter方法,还夹杂着一些莫名其妙的无法在静态类中引用静态方法(源码绝对...原创 2019-08-09 22:41:11 · 2273 阅读 · 1 评论