Download presentation
Presentation is loading. Please wait.
1
聊聊并发编程 猫头鹰表哥
2
现在是“多核”的世界
3
并发不等于并行(concurrent is not parallel)
4
i++ ? 并发、并行面临问题:资源竞争(resource contention) Thread_1 Thread_2 i = 0
5
怎么解决呢? 释放cpu资源等待(release cpu resource),我们知道操作系统(OS)有CPU任何 调度器,如果当前线程(或进程)释放计算资源时,会把当前上下文信息保存起 来,然后把资源让给下一个激活线程(或进程)使用。这本身是需要时间和空间 的。 自旋等待(spinning)不释放当前cpu资源,只是不停的轮询检查是否具备满足条 件。
6
真实世界可能更糟 CPU硬件,OS,编译器,或者VM虚拟机都会对执行代码指令优化执行顺序(不按 你代码的逻辑执行)
7
内存可见性(Memory Visibility)
8
Python and Java 解决方式 Java 内存模型,memory barrier, happe before voliatile
Python GIL( Global Intercepter Lock)所有字节指令顺序原子执行 单核存在并发资源竞争吗? 在Python里,多线程是无用的? multiprocessor 利用多核
9
聊聊Spin Lock设计
10
CAS指令(Compare and Set)
public class TASLock implements Lock { AtomicBoolean state = new AtomicBoolean(false); public void lock() { while (state.getAndSet(true)) {} } public void unlock() { state.set(false); getAndSet( ) 会通知 memory bus 广播所有 core 通讯,同步最新值。这样会导致虽然最终只有一个线程成功,但是其它线程会做无用的数据同步,性能低下。
11
双重检查(Double Check) public class TTASLock implements Lock { AtomicBoolean state = new AtomicBoolean(false); public void lock() { while (true) { while (state.get()) {}; if (!state.getAndSet(true)) return; } public void unlock() { state.set(false);
12
CLH Queue Lock java.util.concurrent.locks.AbstractQueuedSynchronizer
13
class Qnode { AtomicBoolean locked = new AtomicBoolean(true); } class CLHLock implements Lock { AtomicReference<Qnode> tail; ThreadLocal<Qnode> myNode = new Qnode(); ThreadLocal<Qnode> myPred; public void lock() { myNode.locked.set(true); Qnode pred = tail.getAndSet(myNode); myPred.set(pred); while (pred.locked) {} public void unlock() { myNode.locked.set(false); myNode.set(myPred.get());
14
未来是异步的 (Asynchron) Node整个单进程异步回调 风靡一时的Go及协程(Goroutines)
Python3之后的协程语法加强(Corountine) 其实Java1.1就有了green threads
15
Go
16
Python Coroutine
17
Thanks and Question
Similar presentations