nodejs中的并发模型

Sto*_*ica 28 javascript concurrency multithreading node.js

有谁知道nodejs中的内存和线程模型是什么?

特别是ii++原子?它的行为iivolatile在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代码只有一个运行的线程.

  • "你永远不必担心锁定.没有竞争条件或关键部分." 关于Node,我听到了很多.仅仅因为它的单线程并不意味着你不能遇到上述问题.如果两个请求碰巧导致按照"读取,读取,写入"的顺序调用数据库操作,那么两个请求"平衡+ = 10"的经典"银行帐户示例"在单线程异步环境中很容易失败,写". (5认同)
  • 真的是无限的吗?我不会在某个时候回头并变得消极吗? (3认同)
  • 试试这个:`9007199254740992 + 1` (3认同)
  • 但它不是锁定线程(就像在java中一样)。它更多地与数据库原子性有关。不?@JHH (3认同)
  • 我有一个愚蠢的时刻,一秒钟没有意识到为什么那是一个无限循环.对于像我这样慢的人,请记住for循环中的第二个条件是_continuation_的条件,而不是终止.即终止的标准循环是"for(var i = 0; i <0; i ++){}" (2认同)

ali*_*ard 12

只有一个线程(事件循环),除非您执行I/O之类的异步操作,否则您的代码永远不会中断.您无法执行任何并行代码执行.因此,ii ++是原子的.