求阙厅

春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。

IO 系列 MappedByteBuffer

解析 IO...

MappedByteBuffer 从 JDK 的源码来看,MappedByteBuffer 继承自 ByteBuffer,其内部维护了一个逻辑地址变量 address。在建立映射关系时,MappedByteBuffer 利用了 JDK NIO 的 FileChannel 类提供的 map() 方法把文件对象映射到虚拟内存。仔细看源码中 map() 方法的实现,可以发现最终其通过调用 nati...

并发编程 系列 概述

开启 并发编程 新篇章

TPS Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS = CAPS × 每个呼叫平均TPS) TPS是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间...

并发编程 系列 概述

开启 并发编程 新篇章

Java 语言提供了 volatile,在某些情况下比锁要更加方便。如果一个字段被声明成 volatile,Java 线程内存模型确保所有线程看到这个变量的值是一致的。 完整的 volatile 可见性保证 可见性保证遵循以下规则: 如果线程A写入一个volatile变量,线程B随后读取了同样的volatile变量,则线程A在写入volatile变量之前的所有可见的变量值,在线程...

并发编程 系列 AQS

开启 并发编程 新篇章

Java 中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于 AbstractQueuedSynchronizer(简称为AQS)实现的。 AQS 是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过 ReentrantLock 的基本特性和 ReentrantLock 与 AQS 的关联,来深入...

并发编程 系列 概述

开启 并发编程 新篇章

如何减少上下文切换 无锁并发编程: 多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁。 使用最少线程 使用协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。 避免死锁的...

设计模式 系列 观察者模式

开启 设计模式 探索新篇章


设计模式 系列 策略模式

开启 设计模式 探索新篇章

策略模式 定义了 算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化 独立于 使用算法的客户。 UML 组件,其中Context类持有Strategy的引用,ConcreteStrategy实现Strategy接口: Context环境类 Strategy抽象策略类 ConcreteStrategy具体策略类. 实例 JDK集合类 rocket...

设计模式 系列 继承与组合

开启 设计模式 探索新篇章

使用模式最好的方式是:“把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。”以往是代码复用,现在是经验复用。 设计模式让开发人员之间有共享的词汇。设计模式也可以把思考框架的层级提高到模式级别。 基本准则 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 换句话说,如果每次新的需求一来,都会使某方面的代码发生 变化,那...

JVM 系列 内存模型

开启JVM探索新篇章

如果一个对象可以安全地被多个线程同时使用,那它就是线程安全的 线程安全级别 Java 中操作共享数据分为以下5类: 不可变:不可变的对象一定是线程安全的。只要一个不可变对象被正确的构建出来(没有发生this引用逃逸的情况),其在多线程中不会出现不一致的状态。 基本数据类型:使用final修饰即可保证它是不可变的 对象:保证对象的行为不会对...

JVM 系列 内存模型

开启JVM探索新篇章

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层实现。 基本特性 Java 内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的。 原子性 Java内存模型直接保证的原子性变量操作包括:read\load\assign\use\store\write synchronized同步块之间...