<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[AlohaHeja的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/AlohaHeja</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; AlohaHeja]]></copyright><item><title><![CDATA[DNS中的TCP与UDP]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108275058</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108275058</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:40:52 +0800</pubDate><description><![CDATA[参考博客
DNS占用53号端口，同时使用TCP和UDP协议：

DNS在区域传输的时候使用TCP协议
域名解析时使用UDP协议

区域传输
DNS的规范规定了2种类型的DNS服务器：

主DNS服务器
辅助DNS服务器

在一个区中，主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息，而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时，它需要与主DNS服务器通信，并加载数据信息，这就叫做区传送（zone transfer）
辅域名服务器会定时（一般时3]]></description><category></category></item><item><title><![CDATA[浅析ReentrantLock]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274957</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274957</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:38:32 +0800</pubDate><description><![CDATA[重入锁(ReentrantLock)
重入锁（ReentrantLock），就是支持重进入的锁，它表示该锁能够支持一个线程对资源的重复加锁。除此之外，该锁还支持获取锁时的公平性和非公平性选择（默认是非公平）。它是一种独占锁。
ReentrantLock与synchronized对比
（1）都是独占锁，synchronized加锁和解锁的过程自动进行。ReentrantLock加锁和解锁的过程需要手动进行
（2）都可重入，synchronized因为加锁和解锁自动进行，不必担心最后是否释放锁；Reentran]]></description><category></category></item><item><title><![CDATA[InnoDB锁实现]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274807</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274807</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:32:22 +0800</pubDate><description><![CDATA[一、锁
1.基本概念
MySQL的锁是为了解决资源竞争的问题，Java 里面的资源是对象，数据库的资源就是数据表或者数据行。所以锁是用来解决事务对数据的并发访问的问题的。
InnoDB锁有两种

表锁（意向锁，Intention Locks）

意向共享锁（Intention Shared Locks）
意向排它锁（Intention Exclusive Locks）


行锁

共享锁（Shared Locks）
排它锁（Exclusive Locks）



行锁的算法：

记录锁
间隙锁
临键锁

表]]></description><category></category></item><item><title><![CDATA[MySQL事务及隔离级别的实现]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274721</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274721</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:29:40 +0800</pubDate><description><![CDATA[一、MySQL事务
1.概念
事务是数据库执行过程中的一个逻辑单位，由一个有限的数据库操作序列构成。
特点：

它是数据库最小的工作单元，是不可以再分的
它可能包含了一个或者一系列的 DML 语句，包括 insert delete update

2.事务四大特性




特性
说明




原子性（Atomicity）
事务是一个最小的工作单元，整个工作单元要么一起提交成功，要么全部失败回滚


一致性（Consistency）
事务中操作的数据及状态改变是一致的，即写入资料的结果必须完全符合预设的规则，]]></description><category></category></item><item><title><![CDATA[了解双写一致性方案]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274640</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274640</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:26:18 +0800</pubDate><description><![CDATA[解决方案

读请求写请求串行化执行
先更新数据库，再更新缓存
先删除缓存，再更新数据库
Cache Aside Pattern

一、读写请求串行化
串行化执行，保证数据一致性，但是会大幅降低系统吞吐量，不采用
二、先更新数据库，再更新缓存
当数据库数据更新时，先更新数据库中数据，再更新对应的缓存数据。这个方案主要有两个问题。
1.问题1
如果同时有A、B两个请求进行更新操作，那么该方案可能会有以下情况：

A请求更新数据库
B请求更新数据库
B请求更新缓存
A请求更新缓存

本来B请求更新后的数据时最新数]]></description><category></category></item><item><title><![CDATA[Class.forName和ClassLoader.loadClass区别]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274590</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274590</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:23:29 +0800</pubDate><description><![CDATA[Java加载class文件的过程


装载：通过累的全限定名获取二进制字节流，将二进制字节流转换成方法区中的运行时数据结构，在内存中生成Java.lang.class对象；


连接：执行校验、准备和解析步骤
校验：检查导入类或接口的二进制数据的正确性；（文件格式验证，元数据验证，字节码验证，符号引用验证）
准备：给类的静态变量分配并初始化存储空间
解析：将常量池中的符号引用转成直接引用


初始化：激活类的静态变量的初始化Java代码和静态Java代码块，并初始化程序员设置的变量值


加载class到J]]></description><category></category></item><item><title><![CDATA[HotSpot关于GC的部分算法实现]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274507</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/108274507</guid><author>AlohaHeja</author><pubDate>Fri, 28 Aug 2020 10:22:09 +0800</pubDate><description><![CDATA[记忆集参考博客
三色标记算法参考博客
获取GC Roots
1.枚举根节点（保守式GC）
通过遍历方法区和栈找到GC Roots，这个方法有两个弊端：

耗时，现在很多应用仅仅方法区就有上百MB，如果逐个检查的话，效率就会变得不可接受
需要STW（Stop The World），遍历时必须停止用户线程，不然用户线程一直运行，可能会导致GC Roots不断增加，永远也遍历不完

2.OopMap（准确式GC）
HotSpot使用OopMap数据结构来记录程序中对象的引用位置，每次需要GC时只需要扫描OopMa]]></description><category></category></item><item><title><![CDATA[深入了解ArrayList]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104646516</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104646516</guid><author>AlohaHeja</author><pubDate>Wed, 04 Mar 2020 08:35:11 +0800</pubDate><description><![CDATA[List

ArrayList：基于动态数组实现，支持随机访问。
Vector：和 ArrayList 类似，但它是线程安全的。
LinkedList：基于双向链表实现，只能顺序访问，但是可以快速地在链表中间插入和删除元素。不仅如此，LinkedList 还可以用作栈、队列和双向队列。

为什么要先继承AbstractList？
这里是有一个思想，接口中全都是抽象的方法，而抽象类中可以有抽象方法，...]]></description><category></category></item><item><title><![CDATA[转载：关于ConcurrentHashMap和HashMap的分析对比]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104544252</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104544252</guid><author>AlohaHeja</author><pubDate>Thu, 27 Feb 2020 20:36:22 +0800</pubDate><description><![CDATA[原文作者分别对JDK1.7及1.8下ConcurrentHashMap和HashMap的实现进行了详细的源码分析与对比：
原文地址

]]></description><category></category></item><item><title><![CDATA[读写锁（ReentrantReadWriteLock）的实现]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104534694</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104534694</guid><author>AlohaHeja</author><pubDate>Thu, 27 Feb 2020 13:24:45 +0800</pubDate><description><![CDATA[读写锁
读写锁在同一时刻允许多个读线程访问，其他写线程阻塞；在写线程访问时，所有的读线程和其他写线程都被阻塞。
读写锁维护了一对锁，一个读锁，一个写锁，通过分离读锁和写锁，使得并发性比一般的排它锁（独占锁）有了很大提升。Java提供的读写锁是ReentrantReadWriteLock。
ReentrantReadWriteLock的特性




特性
说明




公平性选择
支持非公平(默认)...]]></description><category></category></item><item><title><![CDATA[重入锁（ReentrantLock）的实现]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104531600</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104531600</guid><author>AlohaHeja</author><pubDate>Thu, 27 Feb 2020 10:47:30 +0800</pubDate><description><![CDATA[重入锁(ReentrantLock)
重入锁（ReentrantLock），就是支持重进入的锁，它表示该锁能够支持一个线程对资源的重复加锁。除此之外，该锁还支持获取锁时的公平性和非公平性选择（默认是非公平）。它是一种独占锁。
ReentrantLock常常与synchronized对比分析：
（1）synchronized是独占锁，加锁和解锁的过程自动进行，易于操作，但不够灵活。Reentrant...]]></description><category></category></item><item><title><![CDATA[synchronized的实现原理（锁升级过程）]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104506859</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104506859</guid><author>AlohaHeja</author><pubDate>Tue, 25 Feb 2020 22:26:28 +0800</pubDate><description><![CDATA[1.1 实现基础
 synchronized实现同步的基础：java中的每一个对象都可以作为锁（表现为3种形式）。

对于普通同步方法，锁是当前实例对象（this指针）
对于静态同步方法，锁是当前类的Class对象（xxx.class）
对于同步方法块，锁是synchronized括号里指定的对象（synchronized(obj){}）

1.2 对象头
 synchronized使用的锁对象是...]]></description><category></category></item><item><title><![CDATA[为什么DCL单例需要volatile]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104506224</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104506224</guid><author>AlohaHeja</author><pubDate>Tue, 25 Feb 2020 22:01:16 +0800</pubDate><description><![CDATA[单例设计模式
单例模式属于创建型设计模式，单例模式保证一个类仅有一个实例，并提供一个访问它的全局访问点
单例特性：

单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。

常见实现方式

饿汉式
不管是否使用，都直接创建对象。

public class Single01 {

    private static Single01 INSTANCE...]]></description><category></category></item><item><title><![CDATA[JVM学习笔记---Java内存模型]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104482258</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104482258</guid><author>AlohaHeja</author><pubDate>Mon, 24 Feb 2020 18:07:49 +0800</pubDate><description><![CDATA[12.1 Java内存模型
 Java内存模型（Java Memory Model）是Java虚拟机规范中定义的，用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异，以实现让Java程序在各种平台下都能达到一致的内存访问效果
12.1.1 主内存与工作内存

JMM的主要目标是定义程序中各种变量的访问规则
JMM规定所有的变量都存放在主内存中（虚拟机内存的一部分）
每条线程有自己的...]]></description><category></category></item><item><title><![CDATA[JVM学习笔记---运行时数据区]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104482226</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104482226</guid><author>AlohaHeja</author><pubDate>Mon, 24 Feb 2020 18:05:59 +0800</pubDate><description><![CDATA[文章目录2.1 JVM架构图2.2 运行时数据区和线程2.2.1 JVM系统线程2.2.2 运行时数据区2.2.3 程序计数寄存器1.概述2.作用2.2.4 虚拟机栈（栈）1.概述2.作用3.栈帧3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息2.2.5 本地方法栈
2.1 JVM架构图
 JVM主要分为五大模块：类加载器子系统、运行时数据区、执行引擎、本...]]></description><category></category></item><item><title><![CDATA[JVM学习笔记---类加载器]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104481999</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104481999</guid><author>AlohaHeja</author><pubDate>Mon, 24 Feb 2020 17:54:44 +0800</pubDate><description><![CDATA[文章目录7.1 什么是类加载机制7.2 类加载的时机7.3 类加载的过程7.3.1 加载7.3.2 验证7.3.3 准备7.3.4 解析7.3.5 初始化7.4 类加载器7.4.1 类与类加载器7.4.2 双亲委派模型7.4.3 双亲委派机制工作流程7.4.4 双亲委派机制的优势7.4.5 沙箱安全机制7.4.6 线程上下文加载器（破坏双亲委派机制）7.4.7 对于类加载器的引用
7.1 什么是类...]]></description><category></category></item><item><title><![CDATA[JVM学习笔记---垃圾收集]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/104481626</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/104481626</guid><author>AlohaHeja</author><pubDate>Mon, 24 Feb 2020 17:46:28 +0800</pubDate><description><![CDATA[文章目录3.1 垃圾收集(Garbage Collection)关注的问题3.2 对象存活判断算法3.2.1 引用计数算法3.2.2 可达性算法分析(Rechbility Analysis)3.2.3 再谈引用3.2.4 生存还是死亡3.2.5 回收方法区3.3 垃圾收集算法3.3.1 标记-清除算法（Mark-Sweep）3.3.2 标记-整理算法（Mark-Compact）3.3.3复制算法3...]]></description><category></category></item><item><title><![CDATA[关于HashMap扩容造成死循环的介绍]]></title><link>https://blog.youkuaiyun.com/AlohaHeja/article/details/90576432</link><guid>https://blog.youkuaiyun.com/AlohaHeja/article/details/90576432</guid><author>AlohaHeja</author><pubDate>Sun, 26 May 2019 15:40:58 +0800</pubDate><description><![CDATA[一、造成死循环的原因
HashMap扩容导致死循环的主要原因在于扩容后链表中的节点在新的hash桶使用头插法插入。新的hash桶会倒置原hash桶中的单链表，那么在多个线程同时扩容的情况下就可能导致产生一个存在闭环的单链表，从而导致死循环。
在JDK1.8中，HashMap是不会造成死循环的，因为在JDK1.8中，采用的是尾插法，保证了链表的顺序与之前一致。而且在1.8中链表过长时会转换为红黑树，...]]></description><category></category></item></channel></rss>