| 4.3.4并發(fā)性 選擇器對(duì)象是線(xiàn)程安全的,但它們包含的鍵集合不是。通過(guò)keys()和selectKeys()返回的鍵的集合是Selector對(duì)象內(nèi)部的私有的Set對(duì)象集合的直接引用。這些集合可能在任意時(shí)間被改變。已注冊(cè)的鍵的集合是只讀的。如果您試圖修改它,那么您得到的獎(jiǎng)品將是一個(gè)java.lang.UnsupportedOperationException,但是當(dāng)您在觀(guān)察它們的時(shí)候,它們可能發(fā)生了改變的話(huà),您仍然會(huì)遇到麻煩。Iterator對(duì)象是快速失敗的(fail-fast):如果底層的Set被改變了,它們將會(huì)拋出java.util.ConcurrentModificationException,因此如果您期望在多個(gè)線(xiàn)程間共享選擇器和/或鍵,請(qǐng)對(duì)此做好準(zhǔn)備。您可以直接修改選擇鍵,但請(qǐng)注意您這么做時(shí)可能會(huì)徹底破壞另一個(gè)線(xiàn)程的Iterator。 如果在多個(gè)線(xiàn)程并發(fā)地訪(fǎng)問(wèn)一個(gè)選擇器的鍵的集合的時(shí)候存在任何問(wèn)題,您可以采取一些步驟來(lái)合理地同步訪(fǎng)問(wèn)。在執(zhí)行選擇操作時(shí),選擇器在Selector對(duì)象上進(jìn)行同步,然后是已注冊(cè)的鍵的集合,最后是已選擇的鍵的集合,按照這樣的順序。已取消的鍵的集合也在選擇過(guò)程的的第1步和第3步之間保持同步(當(dāng)與已取消的鍵的集合相關(guān)的通道被注銷(xiāo)時(shí))。 在多線(xiàn)程的場(chǎng)景中,如果您需要對(duì)任何一個(gè)鍵的集合進(jìn)行更改,不管是直接更改還是其他操作帶來(lái)的副作用,您都需要首先以相同的順序,在同一對(duì)象上進(jìn)行同步。鎖的過(guò)程是非常重要的。如果競(jìng)爭(zhēng)的線(xiàn)程沒(méi)有以相同的順序請(qǐng)求鎖,就將會(huì)有死鎖的潛在隱患。如果您可以確保否其他線(xiàn)程不會(huì)同時(shí)訪(fǎng)問(wèn)選擇器,那么就不必要進(jìn)行同步了。 Selector類(lèi)的close()方法與slect()方法的同步方式是一樣的,因此也有一直阻塞的可能性。在選擇過(guò)程還在進(jìn)行的過(guò)程中,所有對(duì)close()的調(diào)用都會(huì)被阻塞,直到選擇過(guò)程結(jié)束,或者執(zhí)行選擇的線(xiàn)程進(jìn)入睡眠。在后面的情況下,執(zhí)行選擇的線(xiàn)程將會(huì)在執(zhí)行關(guān)閉的線(xiàn)程獲得鎖是立即被喚醒,并關(guān)閉選擇器(參見(jiàn)4.3.2小節(jié))。 Java nio入門(mén)教程詳解(三十八) 00 我們認(rèn)為:用戶(hù)的主要目的,是為了獲取有用的信息,而不是來(lái)點(diǎn)擊廣告的。因此本站將竭力做好內(nèi)容,并將廣告和內(nèi)容進(jìn)行分離,確保所有廣告不會(huì)影響到用戶(hù)的正常閱讀體驗(yàn)。用戶(hù)僅憑個(gè)人意愿和興趣愛(ài)好點(diǎn)擊廣告。 我們堅(jiān)信:只有給用戶(hù)帶來(lái)價(jià)值,用戶(hù)才會(huì)給我們以回報(bào)。 |
|
|