unanao's Blog

用心感知世界之美

java 并发

java的并发中一些需要关注的点

1. 多线程同步—— join, CountDownLatch和CyclicBarrier join: 主线程等待子线程结束 CountDownLatch: 一个线程等待多个线程的场景,保证1个线程和多个线程之间的同步。 CyclicBarrier: 线程之间同步并通知 1.1 join public class JoinExample { public sta...

Java IO

Java nio and nio2

1 Java IO 方式 Java 1.4 提供了新的抽象,也就是Channel和Selector类,提供了使用IO服务的通用API。这些新的类提供的强大的新的框架,可以利用了当今主流操作系统的提供的高效IO特性。 JavaIO 方式有很多种,基于不同的IO抽象模型和交互方式,可以简单区分。 1.1 传统的java.io包 基于流模型实现,提供了我们最熟知的一些IO功能,比如File...

Docker和docker-compose 日常使用

基本命令和使用方法

1. 安装 1.1 安装docker 1 2 3 4 5 $ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh --mirror Aliyun $ sudo systemctl enable docker $ sudo systemctl start docker 如果提示: 1 2 3 4 5 Fai...

JDK源代码阅读

源代码阅读的作用和思路

1 如何阅读源代码 1.1 为什么阅读源代码 对代码感兴趣,顺便学习编码技巧,如作为java开发者,不阅读JDK源代码也不影响软件开发,阅读JDK的代码因为感兴趣,顺便学习编程技巧。 确认用法是否正确,如使用了eclipse的paho的mqtt客户端,但是没有文档明确说明它是否实现了连接池,这时候去阅读源代码确实是否需要是否需要为它实现连接池就很有必要...

JVM 基础和内存泄露分析

如何分析内存泄露问题

1 Java 代码时如何运行的 一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。这也就是我们经常说的“一次编写, 到处运行”, 虚拟机的另一个好处是有一个托管环境,能够代替我们处理一些代码中冗长而容易出错的部分。其中最为广为人知的当属自动内存管理与垃圾回收。 执行Java代码首先需要将class文件加载到Java虚拟机中。加载后的Java类会被存放于方...

java 8 新特性

基于项目中使用的例子说明java8的新特性

Java 8让变成变得更容易,代码变得更简洁。有lambda表达式,接口的默认方法,流,新的日期和时间API,Optional还有CompletableFuture。 1 lambda表达式 使用匿名类表示不同的行为并不令人满意,代码啰嗦,它可以让我们很简单的表示一个行为或者代码传递。 例如启动线程读取阻塞队列里面的数据。 private void messageProcess...

Bug多——是系统测试没做好吗?

每个阶段一次把事情做好才是关键

很多项目都会遇到这种情况: 系统测试Bug收敛很慢, 每一轮系统测试都会发现新的问题,让整个团队士气低落, 对质量没信心 验收测试Bug很多,验收过程中,整个项目组都在疲于应付测试发现的问题。 一 真正的原因 系统测试不收敛是系统测试方法不对吗? 验收测试问题多是系统测试做的不全面吗? 从直接原因看, 是系统测试导致的。 系统测试问题不收敛 为什么系统测试Bug多? 因...

软件项目工作量估算

估算工作量的注意事项和方法

项目立项和项目计算都需要估算项目的时间和投入人力,但是计划和实际开发过程总是有偏差。怎么让估算更准确一些呢? 1. 估算很难 项目规模越大越难估算,经验欠缺,项目涉及的人很多,需求也会经常变更,各个服务之间的关系也很复杂。 个人和团队的工作效率也是一个因素,关系是否融洽,配合是否默契都需要进行考虑。 。 2. 提高估算准确性的手段 2.1 积累历史数据和检查列表 这需要有专门...

TCP连接管理

TCP 连接建立和释放

1. TCP 报文段首部格式 TCP虽然时面向字节流的,单TCP传送的的数据单元却是报文段。分为首部和数据两部分。 只介绍后面用的字段的含义: 序号(seq): 占4字节。如果增加到 $2 ^ 32$ - 1, 下一个序号就会又回到0.在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号。首部中的序号字段指的是本报文所发送的数据的第一个字节的序号。 确认号(ack)...

EINTR的处理

Socket中数据发送和接收函数的封装

man某个函数, 如果在ERRORS里面会有如下说明: EINTR The system call was interrupted by a signal that was caught; see signal(7). 说明次系统调用可能永远阻塞,永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。 如果进程在一个慢系统调用...