Presentation is loading. Please wait.

Presentation is loading. Please wait.

聊聊并发编程 猫头鹰表哥.

Similar presentations


Presentation on theme: "聊聊并发编程 猫头鹰表哥."— Presentation transcript:

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


Download ppt "聊聊并发编程 猫头鹰表哥."

Similar presentations


Ads by Google