Object 內置對象

對象Semaphore

纖程信號量對象

信號量對像管理一個內部計數器,此計數器調用acquire 或者wait 後減一,調用release 或者post 後加一。計數器不會減至負數,因為acquire 和wait 在發現數值為0 的時候,會休眠當前纖程,直至其它纖程通過release 或post 增加計數器的值。

信號量常用的場合是限制資源並發使用,以及生產者/消費者模式的應用。

以數據庫請求為例,限制資源並發使用的情形:

1 2 3 4 5 6 7 8 9 10
var maxconnections = 5; var l = new coroutine.Semaphore(maxconnections); ...... l.acquire(); var conn = connectdb() ..... conn.close(); l.release();

生產者/消費者模式通常則將信號量與隊列配合使用。生產者向隊列中加入數據,並post 一個信號,消費者則先wait 信號,獲取信號後去隊查詢取數據。

繼承關係

#lineWidth: 1.5 #font: Helvetica,sans-Serif #fontSize: 10 #leading: 1.6 #.this: fill=lightgray #.class: fill=white [<class>object|toString();toJSON()] [<class>Lock|new Lock()|acquire();release();count()] [<this>Semaphore|new Semaphore()|wait();post();trywait()] [object] <:- [Lock] [Lock] <:- [Semaphore] Lock new Lock() acquire() release() count() Semaphore new Semaphore() wait() post() trywait() object toString() toJSON()

構造函數

Semaphore

信號量構造函數

1
new Semaphore(Integer value = 1);

調用參數:

  • value: Integer, 計數器初始數值

成員函數

wait

等待一個信號量,等同於acquire(true)

1
Semaphore.wait();

post

釋放一個信號量,等同於release()

1
Semaphore.post();

trywait

嘗試獲取一個信號,如不能獲取,則立即返回並返回false,等同於acquire(false)

1
Boolean Semaphore.trywait();

返回結果:

  • Boolean, 獲取成功則返回true

acquire

獲取鎖的擁有權

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

調用參數:

  • blocking: Boolean, 指定是否等待,為true 時等待,缺省為真

返回結果:

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

acquire 方法用於獲取鎖的擁有權,當鎖處於可獲取狀態時,此方法立即返回true。

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

當鎖不可獲取,且blocking 為false,則方法返回false。


release

釋放鎖的擁有權

1
Semaphore.release();

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


count

查詢當前等待任務數

1
Integer Semaphore.count();

返回結果:

  • Integer, 返回任務數

toString

返回對象的字符串表示,一般返回"[Native Object]",對象可以根據自己的特性重新實現

1
String Semaphore.toString();

返回結果:

  • String, 返回對象的字符串表示

toJSON

返回對象的JSON 格式表示,一般返回對象定義的可讀屬性集合

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

調用參數:

  • key: String, 未使用

返回結果:

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