- 浏览: 77616 次
最新评论
-
kevinflynn:
...
ThreadLocal 源码分析 -
kevinflynn:
[url=aaaa][/url]
ThreadLocal 源码分析 -
kevinflynn:
学习到了 感谢楼主。
ThreadLocal 源码分析
文章列表
说明:本篇文章是在阅读《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 处的字符等于旧字符序列中索引 ...