多个线程同时操作同一份数据时如果不加控制可能导致结果错误假设一个变量 count 0两个线程各执行 1000 次 count期望结果是 2000但 count 在底层通常分三步1.从内存读 count 到寄存器2.寄存器加 13.写回内存如果两个线程交替执行· 线程 A 读到 0· 线程 B 也读到 0· A 写回 1· B 写回 1结果只加了 1 次最终可能远小于 2000。这时候就需要锁来把这三步变成一个不可分割的整体同一时刻只让一个线程来做锁的存在是因为并发访问共享数据会破坏原子性可见性和顺序性即使一个线程写、另一个线程读也可能出问题· 可见性线程 A 改了变量线程 B 可能看不到因为值还在 CPU 缓存里没写回内存· 重排序编译器和 CPU 为了优化可能调整指令顺序导致你代码写的顺序和实际执行顺序不一致· 原子性复合操作被中断导致中间状态被别的线程看到一、独占锁· 同一时刻只允许一个线程访问。· 读和读也互斥读和写也互斥写和写也互斥。· 简单、可靠但并发度低。· 适合写多、读写均衡、临界区复杂的场景。二、读写锁· 读锁共享写锁独占。· 读 读可以同时进行。· 读 写不行写 写不行。· 适合读多写少的场景。· 写多时可能还不如独占锁。三、数据嗅探·多核 CPU 里每个核心缓存可能各有一份数据。 一个核心改了数据其他核心必须知道旧副本不能再用。· 数据嗅探就是让各核心监听共享通道发现别人改了就把自己的副本失效或更新。· 作用保证多核看到的数据是一致的。· 和锁的关系锁负责“谁能进”数据嗅探负责“进去后看到的数据是不是最新的”。