乐于分享
好东西不私藏

ConcurrentHashMap源码深度剖析:这才是线程安全的正确姿势

ConcurrentHashMap源码深度剖析:这才是线程安全的正确姿势

一、ConcurrentHashMap的核心设计思想

设计目标:┌─────────────────────────────────────────────────────────┐│ 1. 线程安全:多个线程同时读写,数据不会错乱               ││ 2. 高并发:多个线程可以同时操作不同的数据段               ││ 3. 高性能:读操作尽量无锁,写操作只锁必要部分             │└─────────────────────────────────────────────────────────┘核心策略:锁细化├─► JDK 7:分段锁(Segment)—— 将数据分成多段,每段独立加锁└─► JDK 8:桶锁 + CAS —— 锁的粒度更细,只锁链表/红黑树的头节点

二、JDK 7 分段锁设计

2.1 数据结构

ConcurrentHashMap (JDK 7)├─► Segment[]   ← 继承 ReentrantLock(可重入锁)│    ││    ├─► Segment 0│    │    └─► HashEntry[]  ← 真正的数据数组│    │         ├─► HashEntry → HashEntry → HashEntry(链表)│    │         └─► ...│    ││    ├─► Segment 1│    │    └─► HashEntry[] │    │         └─► ...│    ││    └─► Segment 2│         └─► ...└─► ...

2.2 核心参数

// JDK 7 ConcurrentHashMap 的核心参数public class ConcurrentHashMap<K,V> {    // 默认初始容量:16    static final int DEFAULT_INITIAL_CAPACITY = 16;    // 默认负载因子:0.75    static final float DEFAULT_LOAD_FACTOR = 0.75f;    // 默认并发级别:16(决定了Segment数组的长度)    static final int DEFAULT_CONCURRENCY_LEVEL = 16;    // Segment数组,长度是并发级别    final Segment<K,V>[] segments;    // 一个Segment内部的数据结构    static final class Segment<K,V> extends ReentrantLock {        transient volatile HashEntry<K,V>[] table;        transient int count;        // 元素个数        transient int modCount;      // 修改次数        transient int threshold;     // 扩容阈值        final float loadFactor;      // 负载因子    }}

2.3 定位一个元素的过程

定位元素需要两次哈希:key │ ▼第一次哈希:找到对应的 Segment │   int segmentIndex = (hash >>> segmentShift) & segmentMask │ ▼第二次哈希:找到 Segment 内的 HashEntry 数组索引 │   int entryIndex = hash & (table.length - 1) │ ▼遍历链表找到目标元素

2.4 写操作(put)流程

put(key, value)    │    ▼计算key的hash    │    ▼根据hash找到对应的Segment    │    ▼尝试获取Segment的锁    ├───── 获取成功 ────► 执行写入    │    └───── 获取失败 ────► 自旋等待 + 阻塞等待(自旋次数达到阈值)                                  │                                  ▼                           获取锁后执行写入
// JDK 7 put 方法核心逻辑(简化)public V put(K key, V value) {    int hash = hash(key);    // 找到对应的Segment    Segment<K,V> segment = segmentForHash(hash);    // 调用Segment的put方法    return segment.put(key, hash, valuefalse);}// Segment内部的put方法put(K key, int hash, V value, boolean onlyIfAbsent) {    // 尝试获取锁(继承自ReentrantLock)    lock();    try {        // 写入逻辑...        HashEntry<K,V>[] tab = table;        int index = hash & (tab.length - 1);        HashEntry<K,V> first = tab[index];        // 遍历链表,更新或插入        for (HashEntry<K,V> e = first; e != null; e = e.next) {            if (e.hash == hash && key.equals(e.key)) {                V oldValue = e.value;                e.value = value;                return oldValue;            }        }        // 插入新节点(头插法)        tab[index] = new HashEntry<>(key, hash, first, value);        count++;        return null;    } finally {        unlock(); // 释放锁    }}

2.5 JDK 7 的优缺点

优点:├─► 并发度高:默认16个Segment,最多支持16个线程同时写入├─► 读操作基本无锁(HashEntry的value和next是volatile缺点:├─► 内存开销大:两级数据结构,每个Segment都是一个独立的锁├─► 并发级别固定:创建后不能改变Segment数量├─► 扩容复杂:每个Segment独立扩容└─► 某些操作需要锁所有Segment(如size()、containsValue())

三、JDK 8 桶锁设计

JDK 8 对ConcurrentHashMap进行了彻底重写,放弃了Segment,采用桶锁 + CAS的方式,锁粒度更细,并发度更高。

3.1 数据结构

ConcurrentHashMap (JDK 8)├─► Node<K,V>[] table   ← 数据数组(和HashMap一样)│    ││    ├─► 桶0null│    ││    ├─► 桶1: Node → Node → Node(链表,synchronized锁头节点)│    ││    ├─► 桶2: TreeNode ← 红黑树(synchronized锁根节点)│    ││    └─► 桶3: ForwardingNode ← 扩容时的特殊节点├─► sizeCtl   ← 控制标识(非常重要)│    ├─► -1: 正在初始化│    ├─► -N: 有N-1个线程正在扩容│    ├─► 正数: 下一次扩容的阈值│    └─► 0: 默认值,未初始化└─► 其他辅助结构:CounterCell[](用于高并发计数)

3.2 核心字段

// JDK 8 ConcurrentHashMap 的核心字段public class ConcurrentHashMap<K,V> {    // 存储数据的数组    transient volatile Node<K,V>[] table;    // 扩容时的新数组(正常时为null)    private transient volatile Node<K,V>[] nextTable;    // 控制标识(多用途)    private transient volatile int sizeCtl;    // 计数辅助数组(用于高并发下的计数)    private transient volatile CounterCell[] counterCells;    // 基础计数器    private transient volatile long baseCount;    // 链表转红黑树的阈值(和HashMap一样)    static final int TREEIFY_THRESHOLD = 8;    // 红黑树转链表的阈值    static final int UNTREEIFY_THRESHOLD = 6;    // 转红黑树的最小数组长度    static final int MIN_TREEIFY_CAPACITY = 64;}

3.3 写操作(put)流程

put(key, value)    │    ▼计算hash值(扰动处理)    │    ▼进入死循环(保证一定能插入成功)    │    ├───── case 1: table为空 ────► 初始化数组(CAS设置sizeCtl)    │    ├───── case 2: 目标桶为空 ────► CAS直接插入新节点(无锁)    │    ├───── case 3: 正在扩容 ────► 当前线程帮忙扩容(协同)    │    └───── case 4: 桶不为空 ────► synchronized锁住桶的头节点                                     │                                     ▼                              ├─► 如果是链表:遍历插入/更新                              │                              └─► 如果是红黑树:调用树的插入方法    │    ▼    插入完成后,检查链表长度是否达到8        如果达到8且数组长度<64,触发扩容        如果达到8且数组长度≥64,转红黑树

3.4 源码深度解析

// JDK 8 putVal 方法核心逻辑final V putVal(K key, V value, boolean onlyIfAbsent) {    if (key == null || value == nullthrow new NullPointerException();    // 1. 计算hash值(扰动处理)    int hash = spread(key.hashCode());    int binCount = 0;    // 2. 死循环,直到操作成功    for (Node<K,V>[] tab = table;;) {        Node<K,V> f; int n, i, fh;        // 3. 如果table为空,初始化        if (tab == null || (n = tab.length) == 0)            tab = initTable();        // 4. 如果目标桶为空,CAS插入        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {            if (casTabAt(tab, i, nullnew Node<K,V>(hash, key, value, null)))                break;                   // 插入成功,退出循环        }        // 5. 如果正在扩容,帮忙扩容        else if ((fh = f.hash) == MOVED)            tab = helpTransfer(tab, f);        // 6. 桶不为空,需要加锁操作        else {            V oldVal = null;            // 锁住桶的头节点(粒度极细)            synchronized (f) {                // 再次检查头节点是否被修改(double-check)                if (tabAt(tab, i) == f) {                    // 处理链表                    if (fh >= 0) {                        binCount = 1;                        for (Node<K,V> e = f;; ++binCount) {                            K ek;                            if (e.hash == hash &&                                 ((ek = e.key) == key || (ek != null && key.equals(ek)))) {                                oldVal = e.val;                                if (!onlyIfAbsent)                                    e.val = value;                                break;                            }                            Node<K,V> pred = e;                            if ((e = e.next) == null) {                                pred.next = new Node<K,V>(hash, key, value, null);                                break;                            }                        }                    }                    // 处理红黑树                    else if (f instanceof TreeBin) {                        Node<K,V> p;                        binCount = 2;                        if ((p = ((TreeBin<K,V>)f).putTreeVal(hash, key, value)) != null) {                            oldVal = p.val;                            if (!onlyIfAbsent)                                p.val = value;                        }                    }                }            }            // 7. 插入完成后,检查是否需要转红黑树            if (binCount != 0) {                if (binCount >= TREEIFY_THRESHOLD)                    treeifyBin(tab, i);                if (oldVal != null)                    return oldVal;                break;            }        }    }    // 8. 计数增加    addCount(1L, binCount);    return null;}

3.5 读操作(get)流程

get(key) 全程无锁!    │    ▼计算hash    │    ▼找到对应的桶    │    ├───── 桶为空 ────► 返回null    │    ├───── 桶的第一个节点就是要找的 ────► 直接返回value    │    ├───── 正在扩容(节点hash=MOVED) ────► 去新数组找    │    └───── 链表/红黑树 ────► 遍历查找
// get方法核心逻辑(无锁)public V get(Object key) {    Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;    int h = spread(key.hashCode());    if ((tab = table) != null && (n = tab.length) > 0 &&        (e = tabAt(tab, (n - 1) & h)) != null) {        // 检查头节点        if ((eh = e.hash) == h) {            if ((ek = e.key) == key || (ek != null && key.equals(ek)))                return e.val;        }        // 正在扩容,去nextTable找        else if (eh < 0)            return (p = e.find(h, key)) != null ? p.val : null;        // 遍历链表        while ((e = e.next) != null) {            if (e.hash == h &&                ((ek = e.key) == key || (ek != null && key.equals(ek))))                return e.val;        }    }    return null;}

3.6 扩容机制

JDK 8的扩容是多线程协同的,这是最大的亮点。

触发扩容的条件:1. 链表长度达到8,但数组长度小于642. 元素个数超过阈值(sizeCtl)扩容过程:    │    ▼第一个扩容的线程创建nextTable(新数组)    │    ▼将sizeCtl设置为负数(表示正在扩容)    │    ▼从后往前将每个桶迁移到nextTable    │    ├───── 迁移完一个桶,在原位置放ForwardingNode(hash=MOVED)    │    └───── 其他线程发现是MOVED,会帮忙迁移其他桶    │    ▼所有桶迁移完成后,table指向nextTable    │    ▼恢复sizeCtl为正数(新阈值)
// 扩容时的桶迁移(多线程协同)private final void transfer(Node<K,V>[] tab, Node<K,V>[] nextTab) {    int n = tab.length, stride;    // 计算每个线程负责的桶数(单核直接全包,多核分摊)    if ((stride = (NCPU > 1) ? (n >>> 3) / NCPU : n) < MIN_TRANSFER_STRIDE)        stride = MIN_TRANSFER_STRIDE;    // 第一个扩容线程初始化nextTable    if (nextTab == null) {        try {            @SuppressWarnings("unchecked")            Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n << 1];            nextTab = nt;        } catch (Throwable ex) {            sizeCtl = Integer.MAX_VALUE;            return;        }        nextTable = nextTab;        transferIndex = n;    }    // 每个线程领取自己的任务区间,从后往前迁移    // 迁移完一个桶,放ForwardingNode    // 其他线程看到ForwardingNode,就去帮忙迁移其他桶}

四、JDK 8 的核心优化点

优化点
JDK 7
JDK 8
好处
锁粒度
分段锁(Segment)
桶锁(头节点)
锁粒度更细,并发度更高
锁实现
ReentrantLock
synchronized + CAS
synchronized优化后性能更好
写冲突
锁整个Segment
只锁一个桶
不同桶的写入完全并行
读操作
基本无锁
完全无锁
读性能极高
扩容
每个Segment独立
多线程协同扩容
扩容不阻塞所有写操作
计数
每个Segment维护count
CounterCell数组
高并发下计数更准
结构
两级索引
单级索引(同HashMap)
查询更快,内存更省

五、size()方法的高并发实现

size()方法在并发环境下很难准确,ConcurrentHashMap的设计是尽力而为

publicintsize() {    long n = sumCount();  // 累加baseCount和CounterCell    return ((n < 0L) ? 0 : (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)n);}final longsumCount() {    CounterCell[] as = counterCells; CounterCell a;    long sum = baseCount;    if (as != null) {        for (int i = 0; i < as.length; ++i) {            if ((a = as[i]) != null)                sum += a.value;        }    }    return sum;}

设计思路

  • 没有写操作时,直接使用baseCount

  • 有并发写时,将计数分散到CounterCell数组中

  • 每个线程更新自己的CounterCell,减少竞争

  • size()时累加所有CounterCell

注意:size()返回的是一个近似值,不是精确值。如果要求精确计数,需要使用其他方案。

六、常见面试题解答

问:ConcurrentHashMap是怎么保证线程安全的?

:JDK 8采用桶锁 + CAS的方式。写操作时,如果目标桶为空,直接用CAS插入;如果桶不为空,则synchronized锁住桶的头节点,然后操作链表或红黑树。读操作完全无锁,通过volatile保证可见性。

问:ConcurrentHashMap的锁粒度是什么?

:锁的粒度是桶(数组的每个位置)。多个线程同时操作不同桶时,完全并行;操作同一个桶时,会竞争锁。

问:ConcurrentHashMap的读操作需要加锁吗?

:不需要。Node的val和next都是volatile修饰,保证了可见性。读操作可以无锁并发执行。

问:ConcurrentHashMap的迭代器是强一致性的吗?

:不是。ConcurrentHashMap的迭代器是弱一致性的。迭代时,如果其他线程修改了数据,迭代器不会抛出ConcurrentModificationException,但也不保证能立即看到修改。

问:ConcurrentHashMap为什么不允许key和value为null?

:这是为了避免歧义。如果map.get(key)返回null,无法区分是key不存在还是value就是null。在单线程环境下可以用containsKey()判断,但并发环境下containsKey()的结果可能已经过时。所以干脆不允许null,避免这种二义性。

问:ConcurrentHashMap的并发级别是多少?

:JDK 7的并发级别由Segment数组长度决定,默认16。JDK 8没有并发级别的概念,理论上的并发度等于数组长度,可以支持同时写入不同桶。

问:ConcurrentHashMap在什么情况下会扩容?

:两种情况下会扩容:

  1. 链表长度达到8,但数组长度小于64时,会先扩容而不是转红黑树

  2. 元素个数超过阈值(sizeCtl)时

问:ConcurrentHashMap扩容时能继续写入吗?

:能。扩容时,写线程发现目标桶正在被迁移(头节点是ForwardingNode),会先帮忙迁移,然后再写入新数组。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 11:39:29 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/954827.html
  2. 运行时间 : 0.306921s [ 吞吐率:3.26req/s ] 内存消耗:4,935.48kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=96769fc895a5c3208207f8e2c6987291
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 4.22 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 10.56 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001088s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001923s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.017733s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000766s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001745s ]
  6. SELECT * FROM `set` [ RunTime:0.000657s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001869s ]
  8. SELECT * FROM `article` WHERE `id` = 954827 LIMIT 1 [ RunTime:0.001322s ]
  9. UPDATE `article` SET `lasttime` = 1787283570 WHERE `id` = 954827 [ RunTime:0.046476s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000802s ]
  11. SELECT * FROM `article` WHERE `id` < 954827 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001391s ]
  12. SELECT * FROM `article` WHERE `id` > 954827 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001342s ]
  13. SELECT * FROM `article` WHERE `id` < 954827 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.016738s ]
  14. SELECT * FROM `article` WHERE `id` < 954827 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002478s ]
  15. SELECT * FROM `article` WHERE `id` < 954827 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008584s ]
0.310801s