自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 新的博客网站

传送门https://awakeyoyoyo.github.io/

2021-08-23 19:51:41 90

原创 Mac RabbitMq 安装

mac环境安装rabbit mq

2022-08-02 21:12:48 796

原创 游戏服务器-日志系统

游戏服务器-日志系统游戏服务器的日志系统主要分为业务日志和程序日志。业务日志主要是给运营进行使用。程序日志则主要是给开发者调试日志,查找bug使用扩展:后续可以加上性能检测日志等。业务日志业务日志主要是给运营进行使用。程序日志程序日志则主要是给开发者调试日志,查找bug使用。为了使日志更加的客观,通常按照不同的系统模块来输出对应模块的程序日志文件,方便后续线上来进行查找bug。则程序日志可以继续细分:系统模块日志、架构代码异常日志系统模块日志:游戏有需要功能模块:活动、玩家、登录

2021-09-01 16:14:25 912

原创 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 256

原创 Guava Cache基本使用

前言:Guava 学习笔记,参考自Google Guava官方文档。Guava Cache文章目录前言:Guava CacheCache的回收机制基于容量回收基于定时回收基于引用类型回收具体功能使用加载 CacheLoaderCallable显式插入元素移除监听器 removalListenerasMap视图测试代码Cache的回收机制既然是缓存,那么总会存在没有足够的内存缓存所有数据。Cache提供三大类回收机制。基于容量回收如果要规定缓存项的数目不超过固定值,只需使用CacheBu

2021-08-27 12:12:20 635

转载 Java四种引用及测试代码

前言:学习guavaCache的时候遇到的一些比较模糊的地方,之前复习过的,现在又忘了,写个blog记录一下下。Java 四种引用强引用 Strong Reference日常开发我们锁创建的引用就是强引用。例子:Student obj=new Student();软引用 Solf Reference软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。J

2021-08-24 21:47:57 326

原创 Effective Java 读书笔记(四)

前言:又又来更新了,鸽王了害,自从工作了之后一直很少花时间看书了,最近搬了新的家环境一变,又有了点儿兴致hh,大概率更新的节奏是每周一篇吧,工作日要上班蛮累的。。。希望自己可以坚持下去吧~Item07:Eliminate expired object references 消除过期的对象引用JAVA中有自动的回收功能,但某些地方如果书写的代码不好仍然会出现内存泄漏。这里举个例子:栈实现public class MemoryLeakStack { private Object[] elemen

2021-06-06 17:49:41 171 1

原创 Effective Java 读书笔记(三)

前言:又来更新了,每天点儿时间来更新两个小item,其实本来可以更新三个的,但item07有些地方自己不是蛮熟悉嘛,顺带着需要花点时间看看。这里先更新item05&item06Item05:Prefer dependency injection to hardwiring resources 优先考虑依赖注入来引用资源在实际项目中,有许多类会依赖一个或者多个底层的资源。例子:拼写检查器需要依赖词典,因此有几种可以将其实现的方法。1、将类实现为静态工具类public class SpellC

2021-04-10 16:58:09 89

原创 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 103

原创 Effective Java 读书笔记(一)

前言:开个新的坑位,《effective java》的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了。今天这篇主要记录了item01和item02一些理解。有错误的地方欢迎大佬们指出指出Item01:Consider static factory instead of constructors 考虑用静态工厂方法代替构造器优点:1、静态工厂方法与构造器不一样的地方是:有方法名2、不必在每次调用他们的时候都创建一个新的对象,可以

2021-04-08 14:22:03 240 2

原创 Consumer接口的简介与使用

前言:最近在看公司源码的时候发现了这么个Consumer接口的时候,但是蒙蔽的了一阵。百度后才知其然。然后到现在我还是不知道为啥要多次一举。。。Consumer接口Consumer接口是Java一系列函数式接口中的一个。上源码@FunctionalInterfacepublic interface Consumer<T> { void accept(T t);}accept方法:接收一个对象,然后消费该对象来执行对应的逻辑代码例子:Stuend类public cla

2021-02-20 17:20:36 1253

原创 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 595 1

原创 Netty自定义逻辑线程池实现相同角色的数据修改串行化执行和与work线程分离

前言:目前在写一个简易版的新人游戏服务器demo,使用的是netty框架,由于netty是Reactor模型,由boss线程池进行对于套接字是否就绪的监听,work线程池对于io流进行操作。前面一直将游戏逻辑放在了work线程池中处理,这样子如果遇到一些耗时大的逻辑会影响netty框架对于io流的读取。这里就将新建一个逻辑线程池进行逻辑处理,并且串行化执行对于同一个角色的数据修改。问题:为什么要串行化对于角色数据修改?对于游戏来说,角色的血量、蓝量。这些可能会被其他角色的攻击、buffer、技能等等

2020-12-23 11:59:58 590

原创 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 137

原创 基于snakeyaml读取yml配置文件生成JAVA复杂对象

前言:目前需要做一个将游戏基础数据抽取到配置文件中,然后每次初始化项目就根据配置文件初始化游戏的基础数据,因为之前用springboot比较多,对于yml的书写格式比较熟悉。可以轻松的构造出类的结构。然后在网上搜索了一会儿基本都是一些基础数据的读取、或者是基于springboot注解读取。这里记录一下读取解析集合类型和复杂类型的对象的过程。准备 <dependency> <groupId>org.yaml</groupId>

2020-12-07 12:13:14 1773

原创 JAVA实现生产者消费者模式

前言:貌似很久没更新了,更新一下最近以为自己已经了解,但是还是有一点错误的问题。sychronized版本需要注意:sychronized只允许有一个条件,即只有一个wait方法和notify方法,所以无论谁来唤醒,都会唤醒生成者和消费者,值得注意的地方是wait()方法会放弃锁,而sleep不会放弃锁,所以在判断条件处需要使用while来判断,因为当该线程从wait唤醒时,需要再次判断是否满足条件,而不是直接往下执行。代码:public class SychronizedDemo { p

2020-10-06 16:41:16 186

原创 HTTPS的一点儿理解

前言:复习到http,就顺带着复习一下https吧,发现自己对于https的过程还是不不够清晰的。这里总结一下。HTTPS作用防止窃听主要采用加密的方式来防止窃听:有两种方式非对称加密和对称加密,https两种方式都有用到(非对称加密RSA,对称加密AES),在建立https连接的时候才有非对称密钥加密,建立完https连接后使用对称密钥加密。防止伪装主要使用证书来证明。前提是操作系统中缓存着知名CA机构的公钥,防止CA公钥被伪造。防止修改通过数字签名来解决,数字签名:即散列化后的字符串(

2020-08-19 15:04:25 213

原创 Linux基本知识点(文件权限篇)

文件权限篇Linux文件的属性由10个字符来表示:文件类型:-文件拥有者权限(u): — rwx群组权限(g): — rwx其他人权限(o): — rwx每个身份有3种权限:r 读取的权限 read------4w 写入的权限 write-----2x 执行的权限 execute----1若文件权限是777,则对于拥有者、群组、其他用户的权限都用含有rwx。修改文件的访问权限:chmod格式:chmod mode filemode [u,g,o,a][+,-,=

2020-08-05 15:05:25 279

原创 mysql事务隔离级别的实现原理

前言:好久没更新了,我又回来了。承接上一篇mysql innodb的文章。隔离级别:事务隔离级别要实际解决的问题脏读脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。更新丢失一个事务的更新操作会被另外一个事务的更新操作所覆盖,从而导致数据的不一致不可重复读不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务

2020-07-19 15:38:14 178

原创 Mysql锁机制原理innodb

前言:唏嘘唏嘘,提前批投了一手字节,简历就被筛选掉了,无时无刻不在提醒我是个小菜鸡=。=,老老实实更新了。锁锁的粒度行锁只针对操作的当前行进行加锁。并发情况下,产生锁等待的概率较低,支持较大的并发数,但开销大,加锁慢,而且会出现死锁。(在InnoDB中使用行锁有一个前提条件:检索数据时需要通过索引!因为InnoDB是通过给索引的索引项加锁来实现行锁的。)表锁:表锁的锁定颗粒度在MySQL中是最粗的,InnoDB、MyISAM引擎中都有应用,对当前整张表加锁。不适合高并发的场景,但开销小,加

2020-07-03 22:55:51 450

原创 为什么要用建立索引以及为什么要用b+树?

前言:https://www.youtube.com/watch?v=aZjYr87r1b8 看到了一个印度阿三讲述的B树和B +树。它们在数据库中的作用。精了,以前一直模模糊糊的问题这里一下子就清晰了。这里记录下来。磁盘结构抽象出来的磁盘结构:按等份分为n个扇区(Sector),按照n个圆环分为n个轨道(tracks)。如果我要读去某块区域(block)的内容需要用到(轨道号,扇区号)来进行定位。通常将block块取为512字节。然后block都是从0-511的表示,则我们如果需要读去某段字节,

2020-06-26 01:11:52 295

原创 网络安全基本概念以及结合https分析

前言:本来打算计网就这样结束的,但是貌似安全方面以及https方面没了解,就翻书顺手把那章节大概看了,这里总结一下。对称密钥密码体系在发送方和接收方 公用一个密钥。加密和解密都是用此密钥。这个共享密钥不能为他人所知,只能由双方知道。其他人就算只要加密算法和加密后的报文也不能推断出密钥公开密钥加密发送方和接收方都拥有着两个密钥,一个公钥(提供给发送方来加密报文),一个密钥(用于解密报文)。发送信息用接收方的公钥来加密,而接收方解密则用自己的私钥来解密。两个密钥之一是保密的,无解密密钥,解密不可行。

2020-06-23 22:26:56 211

原创 剑指 Offer 16. 数值的整数次方

题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25来源:力扣(LeetCode)链接:https://leetcode-cn

2020-06-23 11:31:09 194

原创 Web页面的请求过程

前言:到这里的话,我想计网,应该告一段落了,还剩一点密码安全之类的,有空再补补咯,这里借着书上的最后一波总结。请求过程:

2020-06-19 11:04:36 431

原创 Wireshark实验分析各种协议

前言:看完了计网的五层结构,就实际操作一下来捉下不同层下的协议包来康康。加深一下印象=。=实验准备Wireshark软件随意获取一个网站的ip地址,用于过滤TCP三次连接三次握手的连接:第一次握手第二次握手:第三次握手:TCP四次连接//todoDNS连接dns连接主要分为两次:dns查询报文:dns响应报文:DHCP协议由于是笔记本=。=,这里就断开了wifi然后走到二楼连新的wifi。这时笔记本就会启动DHCP协议来获取ip地址Discovero

2020-06-18 23:09:35 3199

原创 链路层学习笔记

前言:你癫够没,我都唔明你读来做乜 ------《激战》链路层主要功能:用于两个设备(同一种数据链路节点)之间进行信息传递。多路访问链路和协议数据链路层使用的信道主要有以下两种类型:点对点信道。这种信道使用一对一的点对点通信方式。广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。那么如何协调多个发送和接收节点对一个共享广播信道的访问呢?对此给予解决的协议有:信道划分协议主要的技术有三种:

2020-06-17 23:42:43 251

原创 网络层----数据平面

前言:最紧要记得自己为咩上台—《激战》网络层基本概括:网络层主要功能为转发(将数据从路由器输入接口转移到合适的输出接口) (数据平面)路由选择(端到端的路径选择),每台路由器都有一张转发表,用最长前缀匹配规则来转发。(控制平面)网络层提供单一的服务:尽力而为的服务,无带宽保证,无丢包保证,无顺序保证,不定时,无拥塞指示。也即差不多根本无服务。这篇博客我们主要讲的是数据平面的东西。-----转发路由器工作原理:输入端口:执行终结入物理链路的物理层功能,执行查找功能(查询转发表决定输出的

2020-06-17 00:17:50 767

原创 拥塞控制原理

前言:好久没更新了,一直堆在笔记本里面,堆了有两三篇博客了,一直懒得更新,今晚逼着自己更新=。= 新的写法:摒弃了之前照抄书本的冗余文字,大多数以自己的话来口述过程。虽然可能会不准确,但看起来更像是自己的东西哈哈。何为拥塞客户端发送数据太多,发送太快导致网络中间层无法处理。表现:分组丢包、分组延迟大拥塞控制的方法端到端拥塞控制端对端:ip层(网络层)不反馈拥塞信息,只能通过端对端来控制,tcp通过超时事件或者三次冗余的ack报文来判断拥塞网络辅助拥塞控制网络辅助:网络层的路由器向发送方

2020-06-10 23:05:39 596

原创 AQS队列同步器的实现分析

前言:上一篇文章已经讲完了大致了解同步器对于我们的作用,这里就来分析下如何完成线程同步。主要包括:同步队列、独占式同步状态获取与释放、共享式同步状态获取与释放以及超时获取同步状态等同步器的核心数据结构与模版方法。同步队列同步器依赖内部的同步队列(一个FIFO的双向队列)来完成同步状态的管理。同步器包含着两个节点类型的引用,一个指向头节点、一个指向尾节点。当前线程获取同步状态失败时,同步器会将当前线程及等待状态信息构造成一个节点,将其插入同步队列的尾部(基于CAS的设置尾节点方法),同时会阻塞该线程。

2020-06-02 15:53:22 280

原创 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 172

原创 ThreadLocal详解

ThreadLocal简介ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法。ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。先上代码public class ThreadLocalTest2 { //(1)创建ThreadLocal变量 public static ThreadL

2020-05-27 22:41:54 168

原创 JAVA堆溢出

前言:看到学校课程q群里面有个同学说遇到oom问题怎么办,然后有一个同学给出了分析dump文件,这让我回想当时看深入理解jvm这本书的时候也看到了相关的例子,不过当时没有跟着操作下去。现在来补一补实现内存泄漏–java堆溢出配置vm参数-Xms20m 堆的最小值-Xmx20m 堆的最大值 避免堆自动扩展-XX:+HeapDumpOnOutOfMemoryError 发生堆溢出的时候生成dump文件以便与后面分析java代码:// vm args:-Xms20m -Xmx20m -XX

2020-05-27 19:53:36 245

原创 单例模式双重检测锁详解以及为何双重检测

前言:在了解完volatile关键字之后,再仔细思考了单例模式的双重检测,发现以前挺多东西还没懂的。DCL(Double Check Lock)public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { //第一次检测 if (uniqueInstance == null

2020-05-22 11:49:55 3699 1

原创 线程安全与锁优化

前言:唏唏唏嘘嘘,终于看完了《深入理解jvm》这本书,虽然看的是跳着看的,部分性能调优方面并没有看,弥补了很多重要的知识,虽然写的博客都是根据书本摘抄而来带上一些个人的体会,但张家辉话斋:你最紧要记得自己为咩上台。没计,既然选择了这条路,点都要顶落去!线程安全与锁优化线程安全的实现方式:​ 同步是指在多线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。1.互斥同步互斥同步是一种常见并发正确性保障手段。互斥时实现同步的一种手段,临界区、互斥量、信号量都是主要互斥的实现方式。互斥同步

2020-05-21 22:44:18 261

原创 JAVA内存模型与线程(二)

JAVA线程调度协同式线程调度线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。优点:实现简单。缺点:执行时间不可控制。抢占式线程调度每个线程由系统分配执行时间,线程的切换不由线程本身决定。Java使用的就是这种线程调度方式。在这种实现线程调度的方式下,线程的执行时间是系统可控的,不会有一个线程导致整个进程阻塞的问题。Java提供10个级别的线程优先级设置,来让某个线程可以分配多一点的执行时间,不过Java线程是被映射到系统的原生线程

2020-05-21 14:30:04 127

原创 JAVA内存模型与线程(一)

前言:《深入理解jvm》差不多看完了重点的部分,揭秘下下一本书是《java并发艺术》,继续冲冲冲。JAVA内存模型(JMM)Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 C/C++等则直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异而导致程序的移植性比较差。Java内存模型必须定义得足够严谨,才能让Java的并发

2020-05-20 10:50:47 231

原创 双亲委派模型的破坏(JDBC例子)

双亲委派模型的破坏双亲委托模型并不是一个强制性的约束模型,而是java设计者推荐给开发者的泪加载器实现方式。但是双亲委托模型存在着缺陷,它虽然解决了各个类加载器的基础类的统一问题,基础被称为基础,就是因为他们总是被用户代码调用,但是如果基础类又要调用回用户代码呢?那么在就会使用基础类的类加载器(启动类加载器)去加载用户的代码,而启动类加载器是加载java_home\lib目录下的。而用户代码都是保存在classpath下,根本就不可能加载到啊=。=其中这个方面最典型的就是jdbc对于双亲委派模型的破坏了。

2020-05-17 10:56:23 1872 1

原创 虚拟机类加载机制

前言:​ 虚拟机并没有约束一定是本地文件才能进行加载,网络文件也是可以的,也没有约束必须是Java文件,一切遵守虚拟机解析规则的文件都能被加载,Java对应的就是Class字节码文件了。​ 不同于其他语言,在编译时就需要进行连接,Java语言中,类型的加载,连接和初始化都是在程序运行期间完成的,这会带来一定的开销,但是会为Java提供高度的灵活性。比如编写一个面向接口的程序,可以在运行时再指定其实际的实现类。虚拟机类加载机制​ 类从被加载到虚拟机内存开始,到卸载处内存,它的整个生命周期包括:卸载、验

2020-05-16 18:43:31 180

原创 垃圾收集器与内存分配策略(二)

前言:续更《深入理解jvm》,本来昨晚就可以出来的这篇,偷懒了=。=,keep going!!!垃圾收集器垃圾回收器是内存回收的具体实现。两个收集器间有连线,表明它们可以搭配使用:Serial/Serial OldSerial/CMSParNew/Serial OldParNew/CMSParallel Scavenge/Serial OldParallel Scavenge/Parallel OldG1其中Serial Old作为CMS出现"Concurrent Mode F

2020-05-15 21:33:38 173

原创 垃圾收集器与内存分配策略(一)

前言:好像蛮久没有更新《深入理解jvm》这本书了,又回来填坑了。垃圾收集器与内存分配策略。程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭。这几个区域的内存分配和回收都具备确定性,在这几个区域基本不需要考虑回收问题。因为方法结束或者线程结束,内存自然就回收了。而java堆和方法区则不一样。方法区存放类信息,一个接口中的多个实现类需要的内存不一样,并且只有在程序运行期间才知道会创建哪些对象。这部分内存的分配和回收都是动态的,所以垃圾回收器所关注的就是java堆和方法区。如何判断对象已死

2020-05-14 18:03:06 166

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除