物件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
20var 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。
繼承關係
建構函數
Lock
建構函數
1new Lock();
成員函數
acquire
取得鎖的擁有權
1Boolean Lock.acquire(Boolean blocking = true);
呼叫參數:
- blocking: Boolean, 指定是否等待,為true 時等待,預設為真
回傳結果:
- Boolean, 回傳是否成功取得鎖,為true 表示成功獲取
acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。
當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。
當鎖不可取得,且blocking 為false,則方法傳回false。
release
釋放鎖的擁有權
1Lock.release();
此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。
count
查詢目前等待任務數
1Integer Lock.count();
回傳結果:
- Integer, 返回任務數
toString
傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現
1String Lock.toString();
回傳結果:
- String, 傳回物件的字串表示
toJSON
傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合
1Value Lock.toJSON(String key = "");
呼叫參數:
- key: String, 未使用
回傳結果:
- Value, 傳回包含可JSON 序列化的值