`
文章列表
说明:本篇文章是在阅读《Java 并发编程艺术》过程中的一些笔记和分析,由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步! 该项目的地址:https://github.com/xiaoheng1/concurrent-pr ...
1.首先要说下 Java 内存模型的抽象,JMM 规定了每个线程都有自己的本地内存,本地内存中存放的是主内存中 共享变量的拷贝. 现在线程 A 需要和线程 B 通讯,则需要通过 A 的本地内存,在 JMM 的控制下,到主内存, 然后从主内存 ...
有关 Java 并发编程艺术的阅读笔记可以去我的 github 上查看: 地址:https://github.com/xiaoheng1/concurrent-programming 本人能力有限,欢迎各位大佬批评指正,我们互相交流,互相学习,共同进步!
dubbo 中有四个线程池: CachedThreadPool:每隔 1 分钟回收空闲线程 FixedThreadPool:固定数量线程 LimitedThreadPool:动态扩展,但是不会收缩 EagerThreadPool:调整了JDK 线程池的工作流程 总结:这四类线程池都是基于 JDK 中的线程池. 需要注意的是 EagerThreadPool. 它修改了 JDK 中线程池的工作流程. 1.<coreSize或 >maxThreadSize,则加入到队列中 2.>coreSize 且 <maxThreadSize,则创建线程处理.
关于 dubbo 的 SpiExtensionFactory 的一点说明: 本篇文章不想比较 dubbo 的 spi 和 jdk spi 的异同,网上有太多文章写了这块,本篇文章主要想说 dubbo @Adaptive 注解的设计以及 SpiExtensionFactory 类. 我们先看下 SpiExtensionFactory 类: public <T ...
1.首先 bossLoop Accept 客户端的连接. 2.bossLoop 创建 NioSocketChannel,并完成对读事件的注册. 3.当客户端发送消息的时候,被 NioSocketChannel 处理.
TCP为啥是可靠的? 首先 TCP 是面向连接的,就跟打电话一样。 TCP报文格式:源端口、目的端口、校验和、序号、确认号、窗口+数据部分 TCP 是如何保证连接的了? 1.序列号 TCP在传输的过程中,对每一个字节都进行了编号,这就是序列号. 序列号的作用: 1.确保数据按序到达 2.保证可靠性(比如说缺哪个序号的数据就能知道) 3.提高效率,可以多次发送,一次确认 4.去除重复数据 2.校验和 校验和用于检验端到端传输的过程中,TCP头部和数据部分是否发生了变化.在计算校验和的时候添加16位的伪首部用于增强校验。将数据分成16位的多个段,每个段取反相加。 3.拥塞控制 ...
啥都是虚的,早上这个可能是好的,晚上可能就坏了。平淡处之。
发展: BIO -> NIO -> AIO BIO就是我们传统意义上的IO,它的特点是阻塞的。例如以前我们进行网络编程时,一个客户端使用一个线程来进行处理。这样会导致一个问题:服务器的线程数是有限制的,而不是每个客户端时时都有数据进行传输的。所以大量空的线程占了位置,但是又不工作,导致服务器的性能受限。 这会涉及到4次上下文切换和4次拷贝。 第一次切换:从用户态切换到内核态,将数据读取到内核 第二次切换:从内核态切换到用户态,读取返回 第三次切换:从用户态切换到内核态,将数据拷贝到内核 第四次切换:从内核态切换到用户态,写完返回 四次拷贝: 1.通过DMA将数据从硬件拷贝到 ...
简单动态字符串: struct{    int len    int free    char buf[]; } 简单动态字符串比 C 中字符串的优点: 1.可以很快的获取字符串的长度 2.在进行字符串操作时,防止溢出 3.减少修改字符串时带来的频繁内存分配 链表: struct listNode{     listNode * prev;     listNode * next;     void * value; } typedef struct list{     // 表头节点     listNode * head;     // 表尾节点     listNode * ...
说明:Byte 类的实现,有一部分方法是借助于 Integer 类的实现. /* * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package jdk.java.lang; /** * * The {@code ...
在 Java 中字符串的执行速度是 StringBuilder > StringBuffer > String 了? 我们先说下 StringBuilder 和 StringBuffer 这两个类. 首先这两个类都是继承的 AbstractStringBuilder. 我们可以看到 AbstractStringBuilder 中使用 char[] 数组来存储字符. 换句话说,AbstractStringBuilder 相当于一个 ArrayList,不过的是 AbstractStringBuilder 只存储字符. 这和 String 的区别是,当一个字符串被频繁的修改的时候, ...
看了 Boolean  的源码设计,我觉得有三个核心. 1.首先 Boolean 是基本数据类型 boolean 的一个包装类,将其封装成对象. 2.是关于 String 和 Boolean、boolean 之间的转换问题. 3.Boolean用于散列表时的 hashCode 的计算.
首先说下 redis 的数据库结构: redisServer{   redisDb *db // 存放服务器中所有的数据库   int dbnum // 服务器的数据库数量 } 默认情况下,dbnum 为 16. redisClient{   redisDb *db // 记录客户端当前正在使用的数据库 } redisDb{   dict *dict // 数据库键空间,保存数据库中所有的键值对 } 可以这么理解:dict 和 Java 中的 Map 很像,k 是一个字符串,value 可以是 StringObject,也可以是 HashObject等. 数据库原来的数据结 ...
说明:这段代码很有意思,它考虑到了 Unicode 的情况,我们如何写反转的话,两头循环,然后交换. 但是这只做了第一步,而 JDK源码中,它考虑到了还原 Unicode 的情况. /**      * 导致此字符序列被序列的反序替换. 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符.      * 因此,高低代理人的顺序永远不会逆转.(也就是说,这个方法将代码点当成了一个整体.)      *      * 在执行 reverse 方法之前,让 n 成为此字符序列的字符长度(不是 char 值中的长度).      * 然后,新字符序列中索引 k 处的字符等于旧字符序列中索引 ...
Global site tag (gtag.js) - Google Analytics