<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      # 說說我對于線程同步的發(fā)散性思考

      本文在 https://wkmcyz.notion.site/2cbaab3404c04513b16f40f48e0c9cb7 閱讀體驗更好。

      我和小輝一起散步,小輝忽然說他最近要寫一個實現(xiàn)鎖能力的機制,可以讓 java 各個線程通過這個機制比較好地實現(xiàn)同步。

      我問他:“那用法是什么?”

      小輝說:“我這個系統(tǒng),給別人調(diào)用的時候,別人只需要傳遞一個閉包就可以了,我會負責確保多個線程調(diào)用相同的閉包的時候,每個閉包都不是并行的。”

      我一想,這個應該比較好實現(xiàn),只需要本地維護一個閉包到執(zhí)行線程列表的對應關系就可以了,有新的線程到來的時候,就判斷一下當前的閉包是不是正在運行,如果有的話,就等待;如果沒有的話,就把這個當做第一個來運行。kotlin 代碼表示的話,就是 :

      val map = HashMap<runnable : Array<Thread>>
      fun runSynchronously(thread : Thread , runnable : Runnable) {
      	if(map.contains(runnable)) {
      		map[runnable].add(thread)
      	} else {
      		map[runnable] = new ArrayList<Thread>(thread)
      		runnable.run()
      	}
      }
      
      private fun runFirst(runnable) {
      	val thread = map[runnable].first()
      	runnable.runInThread(thread)
      	runRunnableNext()
      }
      
      private fun runRunnableNextInNext(runnable :Runnable){
      	map[runnable].removeFirst()
      	runFirst(runnable)
      }
      

      然后我想了想,想到了一個問題:這樣的話,我線程要么不執(zhí)行,進入等待;要么就直接執(zhí)行。那如果兩個線程執(zhí)行的時候想交替執(zhí)行怎么辦?

      小輝說道:“這個是個好問題,需要先想一想。”

      我說:“任務 A 如果要在中間讓任務 B接著做什么的話,就需要任務 A 先完成,就是說這時候任務 A 會有一個分支,從 runnable 中 return,然后任務 B 就可以接著執(zhí)行了。”

      小輝說道:“不過這樣的話,任務 B 開始執(zhí)行的時候,怎么知道該執(zhí)行最初的邏輯還是任務 A 執(zhí)行了一部分以后的邏輯呢?”

      我說:“那就加狀態(tài)變量,任務 A 完成以后,把狀態(tài)變量從 0 設置為 1 , 任務 B 開始的時候判斷一下當前的狀態(tài),如果是 1 的話,就按照 1 的邏輯處理,然后再改為 2,任務 B 再退出,任務 A 再開始,判斷狀態(tài)是 3,就執(zhí)行一個更新的邏輯。”

      小輝說:“好像也不是不行啊……”然后又說道:“就是有點復雜了,這樣的話代碼沒法寫了。全是邏輯判斷。”

      我說:“還好呀,可以寫成 switch(status) 的形式”

      小輝說道:“那我這樣也行啊。你看,系統(tǒng)接受 runnable 以后,交給 runnable 一個 callback,runnable 可以在代碼里面執(zhí)行這個 callback,這個 callback 執(zhí)行的結果就是讓另一個線程來執(zhí)行 runnable。”

      我一聽,覺得很有意思,好像確實可行。但是兩個還好,如果有三個的話,豈不是亂了套了,于是提出了這個問題。

      小輝說道:“那就用倆 callback,一個用來觸發(fā)第二個,一個用來觸發(fā)第三個線程。”

      我說道:“那這就得很多個了,萬一很多線程呢?”

      小輝說道:“那就給每個線程一個列表,如果第一個線程要等待的話,就把自己加入到其中,就告訴系統(tǒng)說讓別人運行吧,這樣別的線程就能開始運行了,就同步了。”

      我點頭。

      小輝繼續(xù)說道:“這樣的話,要是別的線程也不運行,那就都等著,就卡死。”

      我說道:“不太可能都不運行,可以先不考慮。”

      我又說道:“可以考慮多個列表,這樣的話比如線程一要和線程三交流的話,就用第二個列表,線程一要和線程二交流的話,就用第一個列表。線程一做完了事情,要讓線程三繼續(xù)的話,就把自己放到第二個列表里,然后讓線程三開始,線程三開始以后,做了一段事情,要交給線程一了,就把自己加到第二個列表里,然后讓線程一開始。”

      ……

      posted @ 2022-01-25 00:10  wkmcyz  閱讀(49)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美国产日韩久久mv| 午夜福利日本一区二区无码| 亚洲熟女一区二区av| 日本熟妇色xxxxx| 国产亚洲日韩av在线播放不卡| 久久午夜私人影院| 国产成人精品区一区二区| 韩国三级+mp4| 这里只有精品免费视频| 亚洲一区二区三区自拍麻豆| 成av人电影在线观看| 亚洲色在线v中文字幕| 日韩一区二区三区亚洲一| 亚洲粉嫩av一区二区黑人| 成在线人永久免费视频播放| 国产精品日本一区二区不卡视频| 丰满少妇被猛烈进入av久久| 116美女极品a级毛片| 欧美牲交a欧美牲交aⅴ免费真| 综合色一色综合久久网| 久艹视频免费看| 亚洲av一区二区在线看| caoporn成人免费公开| 国产精品成人无码久久久| 亚洲精品精华液一区二区| 国产亚洲精品中文字幕| 金平| 九九热精品在线免费视频| 久久精品国产99国产精品严洲| 潍坊市| 久久香蕉国产线看观看猫咪av| 337p粉嫩大胆噜噜噜| 北宁市| 亚洲国产精品人人做人人爱| 亚洲色在线V中文字幕| 淅川县| 免费黄色大全一区二区三区| 亚洲综合无码AV在线观看| 日韩精品人妻中文字幕| 亚洲嫩模一区二区三区| 久久这里只精品国产免费9|