自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 策略模式---

1.策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。这种经典的策略模式,使得客户端不够简洁,理论上客户端不需要管这个对象怎么创建,只需要调用功能就好了。所以常常和简单工厂模式结合。(1)抽象策略角色: 策略类,通常由一个接口或者抽象类实现。(3)环境角色:持有一个策略类的引用,最终给客户端调用。(2)具体策略角色:包装了相关的算法和行为。定义,代码 摘自 《大话设计模式》场景类,传入你要选择的算法。

2022-09-12 11:29:27 218 1

原创 简单工厂模式

通过 不同 的 传入参数来实例化不同类的实例对象,即专门创建一个类来实现其它类的实例。抽象类---计算方法 , 这里有一个抽象方法,getResult需要子类自己去实现。优点:使用者不需要考虑调用特定类的内部实现。缺点:当有新的需求时,需要去修改工厂类。简单工厂类---利用多态返回父类引用。被创建的实例通畅具有共同的父类。子类----加法计算。

2022-09-12 09:26:45 167

原创 hashmap的一些坑

1.不存在 下标,key 相同的两个Node,因为在putVal()方法中,当存在key和桶位相同的情况的时候,会进行替换操作。这个疑惑是看replace源码时联系到的,当你删除元素时,我在想如果存在key相同的情况怎么办,但是实际上只会有一个这样的node。3.若在一个桶位的上的链表很长且达到扩容阈值但是没有达到树化条件,即使我的table只有这一个桶位 不为null,我仍然进行扩容操作,为了提高查询效率。2.指向一个变量的引用,若为null,那么在没有更新它之前,不管变量怎么变,这个引用还是null。

2022-09-10 12:02:55 226

原创 手写MiniReentrantLock

【代码】手写MiniReentrantLock。

2022-09-03 11:47:26 125

原创 ConcurrentHashMap--transfer(),helpTransfer()

【代码】ConcurrentHashMap--transfer(),helpTransfer()

2022-08-31 12:29:02 281

原创 磁盘的工作方式

磁道就是磁盘存储数据的介质,磁道上布有一层磁介质通过磁头可以使磁介质的极性转换为操作系统的数据信号。磁道上真正存储数据的部分不是连续的,所以又产生了 扇区 的概念。(从磁盘的角度来看,需要找到所在磁道,然后磁头转到所在扇区)。磁盘分区其实是通过分磁盘柱面实现的,每个磁盘分区都有起始柱面和结束柱面,而分区的容量也可以通过这个来计算的。假如你的东西都在一片连续的区域,就省去了 寻道,旋转时延。将磁盘比喻为一个传送带,传送带上有你想要的东西(即数据)。相关概念:磁头,盘片,盘面,磁道,柱面,扇区等。...

2022-08-30 15:28:31 464

原创 ConcurrentHashMap--addCount()

【代码】ConcurrentHashMap--addCount()

2022-08-30 10:55:52 245

原创 ConcurrentHashMap put(),initTable()

【代码】ConcurrentHashMap put(),initTable()

2022-08-29 22:14:45 84

原创 ConcurrentHashMap 基本方法解读

===================

2022-08-29 18:43:50 266

原创 ConcurrentHashMap 字段解读

=============

2022-08-29 12:47:28 106

原创 LongAdder--add()方法源码

【代码】LongAdder--add()方法源码。

2022-08-27 10:33:20 128

原创 HashMap 的哈希函数

在进行 下一步计算时, (n-1) &hash , 由于数组的长度不会太大,那么高位的数字都被屏蔽了,简单来说,高16位变得对整体哈希没有影响。即我的最终计算的哈希值无高位特征。异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值会向0靠拢,采用|运算计算出来的值会向1靠拢。若为奇数,减一之后,那么二进制数为1个0和一堆0,那么你的key都放在这两个地方.然后 异或 (哈希码右移16位) ,其中是哈希码是32位二进制。异或后得到的32位数字 ,高位仍然保持不变,但是低位融合高位的特征。

2022-08-25 12:21:57 162

原创 i++的问题

3)线程 A 执行完 iadd 并且 putfield ,此时 得到 temp = i+1,得到temp=6 ,并将temp的值传给主存中的i(6),然后线程B的拷贝得到的i失效;但是此时线程B已经执行完了temp= i+1,不需要计算,但是temp(6)仍然是未自增的i+1,再进行 i=temp(6) ,导致少加了一。单一的写操作和读操作 都是原子操作,但是i++不是原子操作,即使加了volatile,也不能保证其原子性。假若两条线程 同时执行 i++ 假设i=5。

2022-08-24 22:13:51 147

原创 如何理解什么是存储引擎?

存储引擎的目的就是 怎么去存储数据,在磁盘中怎么去组织数据,怎么组织数据会让数据查询更加高效,存储更加高效,有更多的吞吐量等。执行器会驱动 存储引擎去工作,但是执行器并不是真正工作,只是调用存储引擎提供的接口。我在客户端输入SQL语句,经过Server层的分析,优化,到达执行器。存储引擎对底层磁盘上的数据库进行了封装。底层数据库是 飞机,存储引擎 是发动机,。

2022-08-23 22:32:16 707

原创 InnoDB体系架构

将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,UODO页的回收等IO Thread负责IO请求的回调处理当事务提交后,undolog可能不在需要,因此需要 Purge Thread 来回收已经使用并分配的undo页进行 脏页 的刷新操作。

2022-08-23 22:17:18 272 1

原创 深入理解JVM----垃圾回收算法

在说一下好处:如果不进行对象移动,肯定会产生很多内存碎片,那么当忍无可忍时,我们就只能这么办了,借助OS的非连续内存分配技术,来给我的对象分配内存,那么你的对象内存区域不连续,肯定有一个页表来记录它,这样的话,访存的次数大概率会增加,那么我的应用程序的吞吐量降低了,这是我们不太想看到的。每次只适用其中一块,当这一块的内存用完了,就将存货的对象复制到另一块中。思想:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,当然也可以反过来,标记存放的对象。基于以上的思想,人们改进了此方法。

2022-08-22 17:25:46 164

原创 Redis 0817

说白了,就是一个大map,是用作缓存的,为了减轻数据库的查询压力。

2022-08-18 00:50:01 135

原创 计算机网络 0816

区别在于:每个 请求/响应对 是经一个单独的TCP连接发送,还是所有的 请求/响应对 经相同的TCP连接发送。套接字是 应用程序进程 和 传输层协议 之间的接口,其实就是传输层协议给上层应用层提供的一个服务。Web应用 包括:一个应用层协议HTTP,文档格式的标准HTML,Web浏览器,Web服务器。网络层提供了主机之间的逻辑通信,传输层为运行在不同主机上的进程之间提供了逻辑通信。条件GET方法--- 用于更新代理服务器的对象,保证对象是最新被修改过的。同一个主机之间的进程通信 属于OS的范畴。...

2022-08-17 11:52:12 148

原创 计算机网络 0815

分组交换机 目前比较流行的是 路由器 和 链路层交换机,路由器主要用于网络核心中, 链路层交换机 通常用于 接入网。主机/端系统 字面上是狭义的概念,现在但凡是网络设备都属于主机/端系统的范畴。我们所用的端系统就处在网络边缘,处于一种接入与不接入网的状态。将今天的知识点提炼出来,明天复习一下,这本黑书还是有点东西的,没那么好消化。排队时延导致的分组交换机的输出缓存爆满,从而丢包。节点处理时延,排队时延,传输时延,传播时延。电路交换网络中的复用?为什么要有存储的动作呢?分组交换中的时延,丢包,吞吐量问题?..

2022-08-16 01:42:12 71

原创 0815-----

对于编译器来说,他只认识引用,而不去new对象,只直到父类的引用类型是Animal,会去字节码文件中去找Animal的那个方法。运行阶段的时候,实际上在堆内存中创建的是子类的对象,所有调用方法时,真正参与此方法的对象是子类对象,所以运行阶段会动态执行子类的方法。因为编译器只知道a2的类型是Animal,去Animal字节码(class)文件中去找catchMouse(),但是找不到,所以静态绑定失败。理论上我的子类是具有此方法的,但是你发现你无法 "." 出来,这是编译阶段的问题。编译不成功,无法运行。..

2022-08-15 11:23:54 80

原创 LinkedList---add(),remove()

底层是一个双向链表add()

2022-08-10 23:28:47 162

原创 HashSet扩容机制

留个坑:树化的过程搞懂了,但是具体是如何转化为红黑树,以及如何向红黑树中添加元素,暂时先不管,以及,由于treeifyBin()方法,引起的扩容,还涉及到一个链表的赋值转移。

2022-08-10 23:24:47 143

原创 Vector扩容机制

============

2022-08-08 14:04:56 47

原创 虚拟内存管理

具有请求调入和置换的功能,从逻辑上对内存容量加以扩充的一种存储器系统。

2022-08-08 01:34:09 109

原创 ArrayList的扩容机制

通过阅读add()方法源码以及构造器,总结出如下流程图。

2022-08-07 22:06:56 40

原创 操作系统------内存管理(2)非连续分配内存 段页式管理

将用户进程进行段式管理,因为每一个都是4K,页太多了,不利于管理。而且用户进程是模块化的,不一定就是4K。还是一句话,按照需求,按照模块化进行分段。编译器帮我们分段。段表是二维空间。段表的起始地址和长度在寄存器中,即段表寄存器。实际的数据放在内存中。...

2022-08-07 11:27:31 303

原创 操作系统------讲讲内存管理的历史(1)连续分配内存

GitMind 脑图:内存管理。

2022-08-06 20:48:47 209

原创 近期学习计算机网络的心得

但是直接给你讲进程上下文切换,你是云里雾里的,然后各种问题就出来了,什么是内核态,什么是用户态,什么是线程的状态,堵塞?我记得之前刷力扣算法题,我对于递归的过程十分疑惑,是一个嵌套于解嵌套的过程,就是我的头脑中无法形成一个过程,但是自从学习了JVM之后,了解了它的内存模型,一个线程的私有栈的调用过程,明白了这一递归过程,是一个弹栈压栈的过程,十分形象。我觉得知识还是要潜移默化,而不是一次性的学习,多次的重复的学习然后形成网络,通过系统的学习,到最后,不用刻意的去背八股文,然后从容地去面试。...

2022-08-06 15:10:22 131

原创 java 引用类型---强软弱虚

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了。当GC线程发现引用队列中加入了新元素,那么我看一下她有没有指向堆外内存,有的话借助JVM进行清理。get不到的对象,虚引用指向的对象被GC回收时,会被扔到一个引用队列里。我们一般new一个对象,然后指向这个对象的引用就是强引用。...

2022-08-03 12:50:00 64

原创 生产者---消费者模型

---

2022-08-02 00:19:27 50

原创 wait()和notity()方法

obj.notify()的含义是通知在这个对象上等待的线程不要睡了(waiting),然后到了同步队列(BLOCKED),但是如果没有抢到锁还是不会结束wait方法,直到抢到锁,但是此时占有这个对象的锁的线程并不会释放锁。obj.wait()的含义是作用在此对象的线程进入无限等待状态。释放之前占有的锁,进入等待队列。wait()方法结束的前提是同步队列中此线程抢到了锁。wait是一个对象的方法,并不是只有线程对象才有。...

2022-08-01 23:40:57 101

原创 StringTable的位置

由于永久代的回收效率很低,当老年代满了进行FullGC,而在堆中进行的是MinorGC,十分频繁,由于字符串常量使用十分频繁,所以在堆中更适合。

2022-07-25 01:01:48 111

原创 String类

方式二现在堆中创建空间,里面有一个value属性,char[]数组,指向字符串常量池,如果有,那么不创建,如果没有,在字符串常量池中创建。方式一先去字符串常量池中去看一下有没有这个常量,如果有,直接指向,如果没有,重新创建。equal方法就是比较字符串是否相同的。在JDK8之后,字符串常量池在堆中了。...

2022-07-25 00:58:09 48

原创 变量字符串拼接,常量字符串拼接的区别

利用javap反编译对于变量的字符串拼接来说,由于s1,s2可能会变,我是不能确定具体的值的,底层调用的是new StringBuilder().append(s1).append(s2).toString()StringBuilder重写了toString方法,它又new了一个String 对于常量的字符串拼接来说,在编译器件对代码进行了优化,由于常量的拼接是确定的,所有s5就是"ab",由于这个常量已经在串池中了,所以我们直接拿就行了。因此有......

2022-07-24 23:59:00 264

原创 Integer类的坑

如果你的数字在-128---127之间,之间返回数字,如果在两者之外,new一个。

2022-07-24 20:32:52 116

原创 装箱和拆箱

包装类方法StringInteger。装箱基本类型->包装类型。装箱底层调用的是valueOf方法。包装类是对基本数据类型的扩展。JDK5之后为自动装箱和拆箱。

2022-07-24 20:32:01 68

原创 计算机网络笔记参考

https://www.jianshu.com/c/f627e74e6ff3

2022-07-24 15:23:35 48

原创 MVCC的实现原理

每行记录除了我们自定义的字段之外,还有三条重要的隐式字段DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID。DB_ROW_ID6byte,隐含的自增ID(隐藏主键),如果表中没有主键,InnoDB会自动产生一个聚簇索引。DB_ROLL_PTR7byte,回滚指针,指向这条纪律的上一个版本,用于配合undolog。DB_TRX_ID6byte,最后一次修改(修改/插入)此条记录的事务ID。MVCC实现了多版本并发控制,解决了读写冲突,实现原理依赖于。...

2022-07-24 11:26:13 112

原创 事务的隔离级别

事务的隔离级别越高,事务的并发就越低,唯一的区别就在于,InnoDB在RR的级别就解决了幻读的问题。这个也是InnoDB默认使用使用RR作为事务隔离级的原因,既保证了数据的一致性,又支持较高的并发度。2.读已提交ReadCommitted-RC.一个事务只能读取到其它事务提交的数据,不能读取到其他事务没有提交的数据。1.读未提交ReadUncommitted-RU.一个事务可以读取到其它事务未提交的数据,会出现脏读现象。4.串行化Serializable.所有的事务都是串行化的,无法并发。...

2022-07-21 12:12:44 119

原创 事务并发引发的问题

幻读事务A进行了一个查询语句,发现只有一条数据,当事务B进行insert操作并提交后,事务A再次查询,发现多了一条数据。这是因为在两次读取的间隔中,事务B提交了update操作。不可重复读主要是由于upate和delete操作引发的,幻读主要是由于insert操作引发的。事务B修改数据后,并没有提交,这个时候事务A就查到了修改后的数据,这就是脏读。事务并发带来的三大问题,无论是脏读,不可重复读,还是幻读,它们都是数据库的。脏读事务A读取了事务B未提交的事务。...

2022-07-21 12:01:30 1147

空空如也

空空如也

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

TA关注的人

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