java
文章平均质量分 94
长三月
长期分享游戏服务器/游戏开发/Java干货文章;
长期造各种轮子,分享造轮子心得;
十年以上游戏服务端主程经验,曾担任月流水过亿项目技术负责人
展开
-
用Java实现Actor模型(模仿Skynet)
Actor模型是一种常见的并发模型,与最常见的并发模型——共享内存(同步锁)不同,它将程序分为许多独立的计算单元——Actor,每个Actor独立管理自己的资源,不同Actor之间通过消息传递来交互。它的好处是全异步执行,不会造成线程阻塞,从而提升CPU使用率,另外由于线程之间是异步交互,所以也不用考虑加锁和线程同步的问题。Actor模型在业界有许多应用,例如游戏服务器框架Skynet、编程语言Erlang。因为历史原因,Java下的Actor模型应用较少,知名的只有基于Scala的Akka。原创 2023-05-03 13:53:53 · 1755 阅读 · 5 评论 -
5天带你读完《Effective Java》(五)
在没有考虑默认序列化形式是否合适之前,不要接受它。如果对象的物理表示与其逻辑内容相同,则默认的序列化形式可能是合适的。/*** @serial/*** @serial/*** @serial即使你认为默认的序列化形式是合适的,你通常也必须提供readObject方法来确保不变性和安全性。Entry next;将导出的 API 永久地绑定到当前的内部实现。占用过多的空间。消耗过多的时间。可能导致堆栈溢出。原创 2023-04-07 23:30:01 · 1236 阅读 · 0 评论 -
手把手教你写一个极简版Jedis
Jedis是Redis官方推荐的Jedis客户端,在业界使用非常广泛。通过阅读Jedis源码,可以掌握如何设计和实现一个轻量级、带连接池的Redis客户端。我常常说,学习源码最好的方法就是以自己的思考重新写一遍,这样有助于把学到的知识固化成实际经验。本文会带着你从零开始设计一个极简版的Jedis,从支持最简单的GET/SET命令出发,逐步添加缓冲区、多种命令、断线重连、连接池等多种功能。本文的源代码放在Github上(mini-jedis),感兴趣的读者可以自行取阅。原创 2023-03-10 23:44:56 · 487 阅读 · 0 评论 -
5天带你读完《Effective Java》(四)
Effective Java》是Java开发领域无可争议的经典之作,连Java之父James Gosling都说: “如果说我需要一本Java编程的书,那就是它了”。它为Java程序员提供了90个富有价值的编程准则,适合对Java开发有一定经验想要继续深入的程序员。本系列文章便是这本著作的精华浓缩,通过阅读,读者可以在5天时间内快速掌握书中要点。为了方便读者理解,笔者用通俗易懂的语言对全书做了重新阐述,避免了如翻译版本中生硬难懂的直译,同时对原作讲得不够详细的地方做了进一步解释和引证。原创 2023-03-04 22:31:19 · 1125 阅读 · 0 评论 -
5天带你读完《Effective Java》(三)
标记接口是一种不包含任何方法声明的接口,它只是标记它的实现类具有某种特性。如Serializable 接口,实现此接口的类可以写入ObjectOutputStream(被序列化)。如果要定义类型,那么使用标记接口优于使用标记注解。标记接口定义的类型由标记类的实例实现;标记注解不会。前者在编译时捕获错误,后者在运行时才能捕捉错误。可以更精确地定位。标记注解可以应用于任何类或接口,而标记接口限定于它的实现类。标记注解的优点是:它们可以是其他注解功能的一部分。原创 2023-02-25 18:55:24 · 921 阅读 · 0 评论 -
5天带你读完《Effective Java》(二)
接口只应该用来定义类型,不要用来导出常量。想要导出常量,可以把它们放在相关的类中,如Integer类中的MAX_VALUE;或者定义一个XXXConstants类来存放一组相关的常量。原创 2022-12-17 15:42:50 · 695 阅读 · 0 评论 -
5天带你读完《Effective Java》(一)
Effective Java》是Java开发领域无可争议的经典之作,连Java之父James Gosling都说:“如果说我需要一本Java编程的书,那就是它了”。它为Java程序员提供了90个富有价值的编程准则,适合对Java开发有一定经验想要继续深入的程序员。本系列文章便是这本著作的精华浓缩,通过阅读,读者可以在5天时间内快速掌握书中要点。为了方便读者理解,笔者用通俗易懂的语言对全书做了重新阐述,避免了如翻译版本中生硬难懂的直译,同时对原作讲得不够详细的地方做了进一步解释和引证。原创 2022-12-13 22:09:40 · 1489 阅读 · 0 评论 -
ArrayList 和 LinkedList 之间应该怎么选择
虽然ArrayList会扩容到1.5倍,但是LinkedList内部为每个存储元素封装了Node对象,除了Node对象头部,还要保存前后Node的地址和当前存储元素的地址,实际上LinkedList占用内存要远大于ArrayList。另外在空间上,ArrayDeque底层使用的循环数组也是优于LinkedList使用的Node链表。我写了它,但是我从没用过”。相信很多人在面试时都被问过这个问题,然后一般回答:ArrayList在指定下标访问时快,LinkedList在插入/删除元素时快。原创 2022-11-30 14:32:08 · 774 阅读 · 0 评论 -
Java热更新失败常见原因总结
热更新是Java开发者经常需要考虑的一个问题,无论是游戏还是互联网应用,都需要尽量做到运行时代码修复,以避免重启给用户体验带来的负面影响。目前主流的热更新方案是基于Java的Attach和Instrumentation API。热更新时需要满足不改变方法签名或者类的字段。在普通情况下我们比较容易通过diff看出是否有上述改动,但是在一些特殊情况下失败原因却藏得很深。本文就是通过总结这些特殊情况,避免大家踩坑。本文介绍了几种常见的Java热更新失败情况,对这些情况的理解和掌握有助于读者避免踩坑。原创 2022-10-17 21:10:41 · 2591 阅读 · 0 评论 -
从一条阿里编码规范谈线程池的使用
最近在看阿里Java编程规范,有一条引起了我的注意:【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors 返回的线程池对象的弊端如下:FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为Intege...原创 2020-03-25 17:13:33 · 1242 阅读 · 0 评论 -
MessagePack为什么比Json更小更快
MessgePack和Json都是常见的数据交换格式。Json更常见一些,MessagePack与之类似,但是更小更快。参见官方解释图:上面是原始json,27个字节。下面是用MessagePack打包过的信息,主要思想就是将json中一些重复出现的符号(如括号、冒号、逗号等)用更精简的方式来表示。具体在这个例子中,用82表示有两个map,A7表示一个7字节的字段,C3表示true,00表...原创 2018-12-20 13:25:45 · 1212 阅读 · 0 评论 -
记maven工程导入eclipse遇到的问题
从github上下载maven管理的工程,导入eclipse遇到了一些问题。在此记录下,以备后面查询。先是执行mvn eclipse:eclipse报错:“Failed to retrieve plugin descriptor for …”,以为是网络的问题,但直接浏览器访问域名是可以的,后面换了阿里云的mirror,还是报同样的错。既然用命令转不行,那就试着直接在eclipse ide中导...原创 2018-12-13 14:36:30 · 197 阅读 · 0 评论 -
ConcurrentModificationException引发原因源码简析
Java程序在遍历一个非线程安全的List或Map时,因并发修改很容易出现ConcurrentModificationException,根本原因是遍历时使用的iterator是fail-fast的,也就是说,它认为并发修改是一种不被允许的异常情况,只要出现了就应该尽快失败。 private class Itr implements Iterator<E> { int curs原创 2017-08-20 12:32:23 · 365 阅读 · 0 评论