Sto*_*ica 28 javascript concurrency multithreading node.js
有谁知道nodejs中的内存和线程模型是什么?
特别是ii++原子?它的行为ii是volatile在Java 1.5,Java 1.4,C中,还是根本没有?
Mat*_*ney 39
理解node和V8如何交互是很有用的.节点处理从操作系统等待I/O或计时器.当节点从I/O或计时器唤醒时,它通常会有一些JavaScript回调来调用.当节点运行这些回调时,控制权将传递到V8,直到V8返回节点.
所以,如果你这样做var ii = 1; ii++;,你将永远不会发现ii不是2.所有JavaScript都运行直到完成,然后控制权传递回节点.如果你这样做doSomething(); doSomething();将始终运行doSomething两次,并且它将不会返回到节点的事件循环,直到第二次调用doSomething返回.这意味着您可以完全锁定节点,如下所示:
for (var i=0 ; i >= 0 ; i++) {}
Run Code Online (Sandbox Code Playgroud)
它不会影响您已注册的I/O回调数,设置为关闭的计时器或等待读取的套接字.在V8从无限循环返回之前,节点不再起作用.
这是使节点编程如此美好的部分原因.你永远不必担心锁定.没有竞争条件或关键部分.您的JavaScript代码只有一个运行的线程.