java
文章平均质量分 77
我钟意饮王老菊
Just lose it
展开
-
游戏服务器-日志系统
游戏服务器-日志系统游戏服务器的日志系统主要分为业务日志和程序日志。业务日志主要是给运营进行使用。程序日志则主要是给开发者调试日志,查找bug使用扩展:后续可以加上性能检测日志等。业务日志业务日志主要是给运营进行使用。程序日志程序日志则主要是给开发者调试日志,查找bug使用。为了使日志更加的客观,通常按照不同的系统模块来输出对应模块的程序日志文件,方便后续线上来进行查找bug。则程序日志可以继续细分:系统模块日志、架构代码异常日志系统模块日志:游戏有需要功能模块:活动、玩家、登录原创 2021-09-01 16:14:25 · 1030 阅读 · 0 评论 -
maven标签小解
maven细说一下maven中的遇到的各种标签,遇到不懂得都会在此更新。2021-8-30 更~<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <optional>true</optional>原创 2021-08-31 10:40:29 · 438 阅读 · 0 评论 -
Guava Cache基本使用
前言:Guava 学习笔记,参考自Google Guava官方文档。Guava Cache文章目录前言:Guava CacheCache的回收机制基于容量回收基于定时回收基于引用类型回收具体功能使用加载 CacheLoaderCallable显式插入元素移除监听器 removalListenerasMap视图测试代码Cache的回收机制既然是缓存,那么总会存在没有足够的内存缓存所有数据。Cache提供三大类回收机制。基于容量回收如果要规定缓存项的数目不超过固定值,只需使用CacheBu原创 2021-08-27 12:12:20 · 920 阅读 · 0 评论 -
Java四种引用及测试代码
前言:学习guavaCache的时候遇到的一些比较模糊的地方,之前复习过的,现在又忘了,写个blog记录一下下。Java 四种引用强引用 Strong Reference日常开发我们锁创建的引用就是强引用。例子:Student obj=new Student();软引用 Solf Reference软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。J转载 2021-08-24 21:47:57 · 372 阅读 · 0 评论 -
Effective Java 读书笔记(四)
前言:又又来更新了,鸽王了害,自从工作了之后一直很少花时间看书了,最近搬了新的家环境一变,又有了点儿兴致hh,大概率更新的节奏是每周一篇吧,工作日要上班蛮累的。。。希望自己可以坚持下去吧~Item07:Eliminate expired object references 消除过期的对象引用JAVA中有自动的回收功能,但某些地方如果书写的代码不好仍然会出现内存泄漏。这里举个例子:栈实现public class MemoryLeakStack { private Object[] elemen原创 2021-06-06 17:49:41 · 244 阅读 · 1 评论 -
Effective Java 读书笔记(三)
前言:又来更新了,每天点儿时间来更新两个小item,其实本来可以更新三个的,但item07有些地方自己不是蛮熟悉嘛,顺带着需要花点时间看看。这里先更新item05&item06Item05:Prefer dependency injection to hardwiring resources 优先考虑依赖注入来引用资源在实际项目中,有许多类会依赖一个或者多个底层的资源。例子:拼写检查器需要依赖词典,因此有几种可以将其实现的方法。1、将类实现为静态工具类public class SpellC原创 2021-04-10 16:58:09 · 119 阅读 · 0 评论 -
Effective Java 读书笔记(二)
前言:这次了解的是item03&item04,主要比较新颖的方式是通过枚举的方式来实现单例。Item03:Enforce the singleton property with a private constructor or an enum type 使用私有构造器或者美剧类强化单例模式实现单例模式主要由两种方式:这两种方式都要保持构造器为私有的,并且导出共有的静态成员,以便于客户端能够访问该类的唯一实例。1、用public、final修饰静态成员变量代码:public class S原创 2021-04-09 14:52:43 · 141 阅读 · 0 评论 -
Effective Java 读书笔记(一)
前言:开个新的坑位,《effective java》的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了。今天这篇主要记录了item01和item02一些理解。有错误的地方欢迎大佬们指出指出Item01:Consider static factory instead of constructors 考虑用静态工厂方法代替构造器优点:1、静态工厂方法与构造器不一样的地方是:有方法名2、不必在每次调用他们的时候都创建一个新的对象,可以原创 2021-04-08 14:22:03 · 322 阅读 · 2 评论 -
Consumer接口的简介与使用
前言:最近在看公司源码的时候发现了这么个Consumer接口的时候,但是蒙蔽的了一阵。百度后才知其然。然后到现在我还是不知道为啥要多次一举。。。Consumer接口Consumer接口是Java一系列函数式接口中的一个。上源码@FunctionalInterfacepublic interface Consumer<T> { void accept(T t);}accept方法:接收一个对象,然后消费该对象来执行对应的逻辑代码例子:Stuend类public cla原创 2021-02-20 17:20:36 · 1320 阅读 · 0 评论 -
JAVA遍历集合并修改集合抛出异常ConcurrentModificationException
前言:遍历集合根据某个条件对集合内容进行修改,这是一个非常常用的情景,但在实际开发中有时会抛出ConcurrentModificationException有时候又不会。这里终结一下。例子(一):public class ArrayListTest { public static void main(String[] args) { List<Integer> listA=new ArrayList<>(); listA.add(1);原创 2021-02-19 11:34:24 · 672 阅读 · 1 评论 -
Netty自定义逻辑线程池实现相同角色的数据修改串行化执行和与work线程分离
前言:目前在写一个简易版的新人游戏服务器demo,使用的是netty框架,由于netty是Reactor模型,由boss线程池进行对于套接字是否就绪的监听,work线程池对于io流进行操作。前面一直将游戏逻辑放在了work线程池中处理,这样子如果遇到一些耗时大的逻辑会影响netty框架对于io流的读取。这里就将新建一个逻辑线程池进行逻辑处理,并且串行化执行对于同一个角色的数据修改。问题:为什么要串行化对于角色数据修改?对于游戏来说,角色的血量、蓝量。这些可能会被其他角色的攻击、buffer、技能等等原创 2020-12-23 11:59:58 · 668 阅读 · 0 评论 -
Netty基础之JAVA普通IO与NIO
前言:接到了一个新人培训的第一阶段计划,需要用到netty框架,由于本人之前没什么接触过netty。这里写下博客记录一下学习过程咯。传统IO话不多说吧 先上个栗子:public class OioServer { @SuppressWarnings("resource") public static void main(String[] args) throws IOException { //线程池 ExecutorService pools=Exe原创 2020-12-08 16:20:08 · 160 阅读 · 0 评论 -
基于snakeyaml读取yml配置文件生成JAVA复杂对象
前言:目前需要做一个将游戏基础数据抽取到配置文件中,然后每次初始化项目就根据配置文件初始化游戏的基础数据,因为之前用springboot比较多,对于yml的书写格式比较熟悉。可以轻松的构造出类的结构。然后在网上搜索了一会儿基本都是一些基础数据的读取、或者是基于springboot注解读取。这里记录一下读取解析集合类型和复杂类型的对象的过程。准备 <dependency> <groupId>org.yaml</groupId>原创 2020-12-07 12:13:14 · 2039 阅读 · 0 评论 -
JAVA实现生产者消费者模式
前言:貌似很久没更新了,更新一下最近以为自己已经了解,但是还是有一点错误的问题。sychronized版本需要注意:sychronized只允许有一个条件,即只有一个wait方法和notify方法,所以无论谁来唤醒,都会唤醒生成者和消费者,值得注意的地方是wait()方法会放弃锁,而sleep不会放弃锁,所以在判断条件处需要使用while来判断,因为当该线程从wait唤醒时,需要再次判断是否满足条件,而不是直接往下执行。代码:public class SychronizedDemo { p原创 2020-10-06 16:41:16 · 230 阅读 · 0 评论 -
AQS队列同步器的实现分析
前言:上一篇文章已经讲完了大致了解同步器对于我们的作用,这里就来分析下如何完成线程同步。主要包括:同步队列、独占式同步状态获取与释放、共享式同步状态获取与释放以及超时获取同步状态等同步器的核心数据结构与模版方法。同步队列同步器依赖内部的同步队列(一个FIFO的双向队列)来完成同步状态的管理。同步器包含着两个节点类型的引用,一个指向头节点、一个指向尾节点。当前线程获取同步状态失败时,同步器会将当前线程及等待状态信息构造成一个节点,将其插入同步队列的尾部(基于CAS的设置尾节点方法),同时会阻塞该线程。原创 2020-06-02 15:53:22 · 304 阅读 · 0 评论 -
Lock接口与AQS队列同步器
Lock接口首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口:public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unloc原创 2020-06-01 15:03:36 · 215 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal简介ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法。ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。先上代码public class ThreadLocalTest2 { //(1)创建ThreadLocal变量 public static ThreadL原创 2020-05-27 22:41:54 · 215 阅读 · 0 评论 -
JDK动态代理详解
前言:最近在看Spring aop然后了解到了动态代理=。=,发现自己以前的认识还是停留在应用之上,这里跟着网上的大佬看了看源码,豁然开朗,特别是对于《head first 设计模式》里面的那一副动态代理的uml图。动态代理动态代理,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。 比如说,想要在每个代理的方法前都加上一个处理方法:开撸定义Hel原创 2020-05-10 17:19:45 · 386 阅读 · 0 评论 -
Java内存区域与内存溢出异常(二)
前言读书笔记《深入理解java虚拟机》,这个系列得慢慢更新,因为每个知识都是未接触过的。对象的创建的流程类加载虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用(类名),并且检查这个符号引用的类是否以及被加载、解析和初始化过。如果没有就必须先执行类加载的过程。为新生对象分配内存对象所需要的内存大小在类加载之后便可以完全确认,为对象分配空间的任...原创 2020-04-28 13:54:57 · 140 阅读 · 0 评论 -
Head First 设计模式之代理模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第11章状态模式。这是最后一篇关于这本书的博客了。从2020-4-7开始写的第一篇策略模式一直到现在,唏嘘,终于还是来到了这里。代理模式(的概念允许对象在内部状态改变时改变它的行为,对象看起来好想改变了它的类静态代理模式的uml图此图来源于其他博客代理比较简单,其实就是委托给真正的对象来执行。静态代理也是比...原创 2020-04-27 14:37:18 · 201 阅读 · 0 评论 -
Head First 设计模式之状态模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第10章状态模式。最后剩下没几章了,这几天花时间看完了,现在来才来写下记录。第二篇。状态模式的概念允许对象在内部状态改变时改变它的行为,对象看起来好想改变了它的类状态模式的uml图身份介绍:Context:是一个上下文的类,拥有一些内部状态State:定义一个具有所有具体状态的共同接口ConcreteS...原创 2020-04-27 13:17:22 · 175 阅读 · 0 评论 -
Head First 设计模式之迭代器与组合模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第9章模版方法模式。最后剩下没几章了,这几天花时间看完了,现在来才来写下记录。迭代器模式的概念提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示适配器模式的uml图角色介绍:Clinet:代表客户代码Aggregate:一个共同的接口供所有的聚合使用,将客户代码与具体的集合对象实现解耦...原创 2020-04-27 12:09:05 · 210 阅读 · 0 评论 -
Head First 设计模式之模版方法模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第8章模版方法模式。难顶呀每晚看完书,第二天早上总结。理解到了以前学习java、spring中的一些基础的概念,蛮有用的,希望自己可以一直坚持下去吧。模版方法模式的概念在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤适配器模式的uml...原创 2020-04-22 11:22:56 · 165 阅读 · 0 评论 -
Head First 设计模式之适配器模式与外观模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第7章适配器模式以及外观模式。先从适配器模式再到外观模式。适配器模式的概念将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无限。适配器模式的uml图Client:用户类,使用新接口Target来完成某些特定的需求。Target:新的接口类,开放特定接口request来完成某些...原创 2020-04-22 10:20:52 · 186 阅读 · 0 评论 -
Head First 设计模式之命令模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第六章装命令模式。命令模式的概念将请求封装成对象,这可以让你使用不同的请求、队列、或者日志请求来参数化其他对象,命令模式也支持撤销操作,当需要将发出请求和执行请求的对象解耦的时候,使用命令模式即可。命令模式的uml图简单介绍一下:命令(Command):为所有命令声明了一个接口。调用命令对象的 execu...原创 2020-04-21 11:38:10 · 217 阅读 · 0 评论 -
Head First 设计模式之单例模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第五章装单例模式。连续看了两章,下一章预告命令模式。单例模式看着简单,但其中的道理并不少。单例模式的概念用于确保一个类只有一个实例,并提供全局访问点。由于过于简单吧,跳过日常举例子的环节,直接写出一步步演变的单例模式经典单例模式public class Singleton { private static ...原创 2020-04-21 08:58:08 · 255 阅读 · 0 评论 -
leetcode------合并排序数组
题目合并排序的数组给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。示例:输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3输出: [1,2,2,3,5,6]说明:A.length == n + m第一次看...原创 2020-04-19 13:15:55 · 295 阅读 · 0 评论 -
Head First 设计模式之工厂模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第四章装工厂模式。其实这一章前几天就看完了,拖延癌晚期,没整理,今天就来填一下坑吧。抽象工厂模式的概念提供一个接口用于创建相关或者依赖对象的家族,并不需要明确指定具体类工厂方法模式的概念定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类注意:上述所写的接口并不是ja...原创 2020-04-17 15:22:53 · 146 阅读 · 0 评论 -
基于Lucene实现博客搜索功能
前言:最近毕设开会无意间听到小陈同学使用lucene整一个全文索引,出于好奇了解了一下发现其是结合相关分词器可以对一大段文字建立索引,然后可以实现搜索功能,本来博客一直差着一个搜索博客功能(不想通过数据库模糊查询来做),发现lucene之后感觉打开新世界大门。简单介绍luceneLucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,...原创 2020-04-16 21:42:05 · 356 阅读 · 0 评论 -
Java内存区域与内存溢出异常(一)
前言:开了新坑,读书笔记了又。《深入理解java虚拟机》。慢慢坚持下去吧,看砖头书很难,但没办法,顶到既,订到既。基本概念java虚拟机运行时数据区:方法区、虚拟机栈、本地方法栈、堆、程序计数器线程共享内存:方法区、堆线程私有内存:虚拟机栈、本地方法栈、程序计数器那么到底什么是线程私有和共享呢?解答:各个线程之间该模块具有独立的内存空间,各个线程中此模块互不影响、独立存储则为线程私有...原创 2020-04-14 01:31:36 · 165 阅读 · 0 评论 -
Head First 设计模式之装饰者模式(Java例子)
前言:来源于《head first 设计模式》。当作读书笔记了,这次看的是第三章装饰者模式。看得有点上瘾。。。抽出了点时间来总结一下。装饰者模式的概念动态地将责任附加到对象之上。想要扩展功能,装饰者提供有别于继承的另一种选择。head fitst基本操作举个例子head first里面举了两个例子,一个是星巴克一个我们熟悉的java i/o包。这里为了方便就用java i/o来展示我...原创 2020-04-12 18:48:20 · 258 阅读 · 0 评论 -
hashMap常见的问题解答
1.HashMap的数据结构?hashmap采取数组+链表的数据结构,在遇到哈希冲突的时候采用链表结构来解决哈希冲突,jdk1.8后分成了两种情况,bucket中元素个数大于8的时候,自动转换为红黑树的结构。目的是因为链表的查询速度比较慢,元素越多越明显,改成红黑树是为了提高查询速度。2.hashmap为什么线程不安全?1.7的hashmap扩容的时候都是采用头插入的方法,在扩容的时候,r...原创 2020-04-08 22:08:00 · 781 阅读 · 2 评论 -
JDK1.8之前ConcurrentHashMap与1.8之后的ConcurrentHashMap的源码分析
ConcurrentHashMap1.8之前的concurrenthashmap采用的是分段式锁的策略。ConcurrentHashMap的主干是Segment数组,而Segment数组的主干是我们最熟悉的HashEntry<K,V>数组1.8之前concurrentHashMap先简单介绍一下各个变量的含义concurrencyLevel:并行度MAX_SEGMENTS:...原创 2020-04-08 21:49:42 · 650 阅读 · 0 评论 -
与我常在’s Blog的技术介绍
前言:大三上学期刚结束,大作业写了一个社区提问的demo,然后寒假心血来潮将其整合成一个博客网站,于是就有了这个网站了,这个网站我会用心的维护更新新的技术进去不断迭代。期待各位大佬给小弟提意见噢与我常在’s Blog博客地址:http://blog.awakeyoyoyo.com/技术栈项目构建:Mavenweb框架:Springboot数据库ORM:Mybatis数据库:MyS...原创 2020-04-08 13:33:31 · 263 阅读 · 2 评论 -
Head First 设计模式之策略模式(Java例子)
前言:最近在看<head first 设计模式>,第一章学习的是策略模式,这里记录一下看书的过程。写一下笔记,画个uml图加深印象。也喜欢对学习设计模式的读者有点帮助。策略模式的概念:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的用户。举个例子理解:此例子来源于《head firsrt 设计模式》。设计一个模拟鸭子的应用。鸭子的主...原创 2020-04-07 15:42:00 · 239 阅读 · 1 评论 -
java序列化与反序列化
序列化和反序列化的概念1、把对象转换为字节序列的过程称为对象的序列化。2、把字节序列恢复为对象的过程称为对象的反序列化。对象的序列化主要有两种用途:1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;2) 在网络上传送对象的字节序列。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象...原创 2020-03-31 15:00:25 · 238 阅读 · 0 评论 -
Jdk1.8的HashMap源码分析以及深入hashmap如何确定hash桶索引
前言:最近在复习基础的东西,学着看了一下hashmap源码,只看了jdk1.8的版本,一步步看下来,不懂得就google,发现收获挺大的Jdk1.8的源码分析:先从成员变量开始: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; static final int MAXIMUM_CAPACITY = 1 &...原创 2020-03-17 20:54:44 · 610 阅读 · 0 评论 -
springboot集成shiro进行权限管理
前言:由于博客的接口有部分只能由管理员来调用。但如果每个接口都亲自写代码进行权限管理就过于麻烦了,所以引入了shiro这个安全框架,顺带也将原来不规范的密码明文存储在数据库,改为了md5加密。博客的地址:blog.awakeyoyoyo.comshiro基本知识这里略过了,上一篇文章基本带大家入了个门了。step1增加4个表来进行角色权限的管理角色表:权限表:用户-角色中间表...原创 2020-03-12 22:01:02 · 181 阅读 · 0 评论 -
shiro入门01------10分钟运行一个shiro程序
前言:shiro的基础知识在网上一搜一大堆,我这里也就不列出来了。。,然后最近想在博客网站中加入shiro这个安全框架,所以就去shiro官网找些入门例子学习一下吧。10分钟运行一个shiro程序 来源于shiro官网http://shiro.apache.org/tutorial.html1.随意创建一个新目录,shiro-tutorial并在将创建pom.xml文件<?xml ...原创 2020-03-08 22:12:49 · 225 阅读 · 0 评论 -
comparator和comparable的区别
前言:comparator和comparable都是用来实现集合中元素的排序比较的。Comparator位于包java.util下,而Comparable位于包java.lang下。他们之间的区别在于用法上。Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。Comparable 是一个对象本身就已经支...原创 2020-01-15 16:59:00 · 3928 阅读 · 1 评论