聊聊并发编程 猫头鹰表哥
现在是“多核”的世界
并发不等于并行(concurrent is not parallel)
i++ ? 并发、并行面临问题:资源竞争(resource contention) Thread_1 Thread_2 i = 0
怎么解决呢? 释放cpu资源等待(release cpu resource),我们知道操作系统(OS)有CPU任何 调度器,如果当前线程(或进程)释放计算资源时,会把当前上下文信息保存起 来,然后把资源让给下一个激活线程(或进程)使用。这本身是需要时间和空间 的。 自旋等待(spinning)不释放当前cpu资源,只是不停的轮询检查是否具备满足条 件。
真实世界可能更糟 CPU硬件,OS,编译器,或者VM虚拟机都会对执行代码指令优化执行顺序(不按 你代码的逻辑执行)
内存可见性(Memory Visibility)
Python and Java 解决方式 Java 内存模型,memory barrier, happe before voliatile Python GIL( Global Intercepter Lock)所有字节指令顺序原子执行 单核存在并发资源竞争吗? 在Python里,多线程是无用的? multiprocessor 利用多核
聊聊Spin Lock设计
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 通讯,同步最新值。这样会导致虽然最终只有一个线程成功,但是其它线程会做无用的数据同步,性能低下。
双重检查(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);
CLH Queue Lock java.util.concurrent.locks.AbstractQueuedSynchronizer
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());
未来是异步的 (Asynchron) Node整个单进程异步回调 风靡一时的Go及协程(Goroutines) Python3之后的协程语法加强(Corountine) 其实Java1.1就有了green threads
Go
Python Coroutine
Thanks and Question