join(user) {
if(this.room.length === 2) throw new Error('The room is full');
this.room.push(user);
};
如果異步性在'功能'的基礎上進行,這段代碼是100%防彈的。在一個房間裏不可能有兩個以上的用戶。是不同步a)函數或b)代碼行的常量?
如果「每行」出現異步,則此代碼可能會失敗。爲什麼?因爲如果三個用戶同時進入房間,以下情況可能會以10毫秒爲間隔發生:
1ms:房間爲空。讓用戶A進入數組。
4ms:房間有一個用戶。
5ms:用戶B要求加入。
6ms:用戶C要求加入。
7ms:檢查數組的長度(1)。
8ms:檢查數組的長度(1)。
9ms的:推送用戶B數組,因爲房間的長度爲1
10ms的:推送用戶C數組,因爲房間的長度爲1
15ms的:現在室有3個用戶和max爲2 。
如果異步性是以「每行」爲基礎的,如何避免前面的例子在真實場景中發生?對不起,如果我沒有叫他們的名字,但我想不出一個更好的方式來解釋這一點。
評論提示(但不能肯定地和明確地說)同一功能的「實例」不會彼此重疊。指向同一個對象/數組的不同功能呢?
join(user) {
if(GLOBAL.room1.length === 2) throw new Error('The room is full');
GLOBAL.room1.push(user);
};
join2(user) {
if(GLOBAL.room1.length === 2) throw new Error('The room is full');
GLOBAL.room1.push(user);
};
由於您提到了node.js,因此它使用了單線程模型,這意味着您的函數將在您獲得對該函數的另一個調用之前完全執行(假設'this.room.push()'不是以某種方式重寫,以進入'join()'的遞歸調用)。一般來說,JavaScript並沒有很多需要鎖/ semapohres等的其他語言的併發性挑戰,以避免你所描述的情況。 – tavnab
可能重複的[JavaScript是否保證單線程?](https://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – tavnab
你基本上是描述共享多線程環境或[coroutines](http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/)。相反,JavaScript環境通常是事件驅動和單線程的。這有幫助嗎? – jib