Object 內建對象

物件Lock

Lock 是一個內建對象,它可以用來控制纖程並發存取, 可以透過一個纖程取得鎖,來阻止其他纖程同時取得。Lock 可以透過coroutine.Lock() 函數創建

常見情況是,在一個多執行緒的場景中,當多個執行緒都想修改同一份資料時,就會出現資料不一致。例如,兩個執行緒都想修改同一份資料中的同一個值,在控制不當的情況下,可能會產生結果的不一致。這時使用Lock 對象,就可以實現對同一份資料的互斥存取。

以下是一個簡單的例子,使用Lock 實作兩個纖程交替執行,且共享變數v 的值不為300。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
var coroutine = require("coroutine") var l = new coroutine.Lock() var v = 100 function f() { l.acquire() v = 200 coroutine.sleep(1) v = 300 l.release() } coroutine.start(f) coroutine.sleep(1) l.acquire() assert.notEqual(300, v) assert.equal(200, v) l.release()

首先建立了一個Lock對象,並進入纖程f,取得鎖後修改變數v,然後釋放鎖。在主執行緒中,先等待纖程f 完成…當纖程f 釋放了Lock 後,主執行緒開始取得Lock,確保變數v 的值改為300。

繼承關係

%0 object object toString() toJSON() Lock Lock new Lock() acquire() release() count() object->Lock Condition Condition Lock->Condition Event Event Lock->Event Semaphore Semaphore Lock->Semaphore

建構函數

Lock

建構函數

1
new Lock();

成員函數

acquire

取得鎖的擁有權

1
Boolean Lock.acquire(Boolean blocking = true);

呼叫參數:

  • blocking: Boolean, 指定是否等待,為true 時等待,預設為真

回傳結果:

  • Boolean, 回傳是否成功取得鎖,為true 表示成功獲取

acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。

當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。

當鎖不可取得,且blocking 為false,則方法傳回false。


release

釋放鎖的擁有權

1
Lock.release();

此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。


count

查詢目前等待任務數

1
Integer Lock.count();

回傳結果:

  • Integer, 返回任務數

toString

傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現

1
String Lock.toString();

回傳結果:

  • String, 傳回物件的字串表示

toJSON

傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合

1
Value Lock.toJSON(String key = "");

呼叫參數:

  • key: String, 未使用

回傳結果:

  • Value, 傳回包含可JSON 序列化的值