脱了她裤子摸进她的内裤GIF 精品国产三级a∨在线 男人J放进女人的P视频全过程 全黄一级裸片视频 久久精品99国产精品日本 一个人WWW在线观看免费中文 免费天天看片在线观看视频 一直按小豆豆为什么会抖 YW1139.龙物视频在线观看 最近最新中文字幕大全 亚洲成A人无码亚洲成A无码特黄 野花高清在线观看免费动漫 高清日韩美剧在线观看 国产老熟女乱子人伦视频 精品亚洲无码不卡一区二区三区 黄 色 免 费 大 片 爱苹果AV,apgav 伊伊综合在线视频无码 特黄a级日本大片 美丽人妻被按摩中出中文字幕 德国极品少妇videossexhd 国产av无码日韩av无码网站 欧美牲交a欧美牲交vdo 国产日产欧产精品精品蜜芽 毛片电影免费播放 天天做天天爱天天综合网2021 最刺激黄a大片免费无需下载 一级片看看 扒开老师内衣吸她奶头动态图 asian艳丽的少妇pics 边摸边吃奶又黄激烈视频 精品国产免费人成电影在线观看 好紧我太爽了色视频 欧美裸体柔术牲交视频 日本黄色网站 日本人妻久久久中文字幕乱码 欧美亚洲中文字幕 综合亚洲av图片区 色欲影视 免费天天看片在线观看视频 乡村大乱纶肥水不外流 老妇炕上偷老汉视频露脸 欧美一级片免费看 六月丁香综合婷婷 2020国产成人最新视频不卡 亚洲AV永久无码天堂网小说区 美女高潮视频大片免费 精品一卡2卡三卡4卡芒果app 国产曰本清纯AV无码不卡 房东老头揉捏吃我奶头影片

    千鋒教育-做有情懷、有良心、有品質的職業教育機構

    當前位置:首頁  >  IT面試題  >  物聯網面試題  >  正文

    多線程開發帶來的問題與解決方法?

    來源:千鋒教育
    作者:wjy
    關鍵詞: 杭州 長沙
    2022-09-26
    分享

      使用多線程主要會帶來以下幾個問題:

      一、線程安全問題

      線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程就發生了線程安全問題,表現形式為數據的缺失,數據不一致等。

      線程安全問題發生的條件:

      1)多線程環境下,即存在包括自己在內存在有多個線程。

      2)多線程環境下存在共享資源,且多線程操作該共享資源。

      3)多個線程必須對該共享資源有非原子性操作。

      線程安全問題的解決思路:

      1)盡量不使用共享變量,將不必要的共享變量變成局部變量來使用。

      2)使用synchronized關鍵字同步代碼塊,或者使用jdk包中提供的Lock為操作進行加鎖。

      3)使用ThreadLocal為每一個線程建立一個變量的副本,各個線程間獨立操作,互不影響。

    多線程開發帶來的問題與解決方法?

      二、性能問題

      線程的生命周期開銷是非常大的,一個線程的創建到銷毀都會占用大量的內存。同時如果不合理的創建了多個線程,cup的處理器數量小于了線程數量,那么將會有很多的線程被閑置,閑置的線程將會占用大量的內存,為垃圾回收帶來很大壓力,同時cup在分配線程時還會消耗其性能。

      解決思路:

      利用線程池,模擬一個池,預先創建有限合理個數的線程放入池中,當需要執行任務時從池中取出空閑的先去執行任務,執行完成后將線程歸還到池中,這樣就減少了線程的頻繁創建和銷毀,節省內存開銷和減小了垃圾回收的壓力。同時因為任務到來時本身線程已經存在,減少了創建線程時間,提高了執行效率,而且合理的創建線程池數量還會使各個線程都處于忙碌狀態,提高任務執行效率,線程池還提供了拒絕策略,當任務數量到達某一臨界區時,線程池將拒絕任務的進入,保持現有任務的順利執行,減少池的壓力。

      三、活躍性問題

      1)死鎖

      假如線程 A 持有資源 2,線程 B 持有資源 1,他們同時都想申請對方的資源,所以這兩個線程就會互相等待而進入死鎖狀態。多個線程環形占用資源也是一樣的會產生死鎖問題。

      解決方法:

      - 避免一個線程同時獲取多個鎖

      - 避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源。

      - 嘗試使用定時鎖,使用 lock.tryLock(timeout) 來代替使用內部鎖機制。 想要避免死鎖,可以使用無鎖函數(cas)或者使用重入鎖(ReentrantLock),通過重入鎖使線程中斷或限時等待可以有效的規避死鎖問題。

      2)饑餓

      饑餓指的是某一線程或多個線程因為某些原因一直獲取不到資源,導致程序一直無法執行。如某一線程優先級太低導致一直分配不到資源,或者是某一線程一直占著某種資源不放,導致該線程無法執行等。

      解決方法:

      與死鎖相比,饑餓現象還是有可能在一段時間之后恢復執行的??梢栽O置合適的線程優先級來盡量避免饑餓的產生。

      3)活鎖

      活鎖體現了一種謙讓的美德,每個線程都想把資源讓給對方,但是由于機器“智商”不夠,可能會產生一直將資源讓來讓去,導致資源在兩個線程間跳動而無法使某一線程真正的到資源并執行,這就是活鎖的問題。

      四、阻塞

      阻塞是用來形容多線程的問題,幾個線程之間共享臨界區資源,那么當一個線程占用了臨界區資源后,所有需要使用該資源的線程都需要進入該臨界區等待,等待會導致線程掛起,一直不能工作,這種情況就是阻塞,如果某一線程一直都不釋放資源,將會導致其他所有等待在這個臨界區的線程都不能工作。

      當我們使用synchronized或重入鎖時,我們得到的就是阻塞線程,如論是synchronized或者重入鎖,都會在試圖執行代碼前,得到臨界區的鎖,如果得不到鎖,線程將會被掛起等待,知道其他線程執行完成并釋放鎖且拿到鎖為止。

      解決方法:

      可以通過減少鎖持有時間,讀寫鎖分離,減小鎖的粒度,鎖分離,鎖粗化等方式來優化鎖的性能。

      臨界區: 臨界區是用來表示一種公共的資源(共享數據),它可以被多個線程使用,但是在每次只能有一個線程能夠使用它,當臨界區資源正在被一個線程使用時,其他的線程就只能等待當前線程執行完之后才能使用該臨界區資源。

      比如辦公室辦公室里有一支筆,它一次只能被一個人使用,假如它正在被甲使用時,其他想要使用這支筆的人只能等甲使用完這支筆之后才能允許另一個人去使用。這就是臨界區的概念。

    聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。

    相關推薦

  1. 談談網絡的分層結構 1. 物理層:不是指具體的物理設備 指的是物理設備的標準制定 (網線 光纖的接口類型 網卡的電流強弱)比特流 2. 數據鏈路層:負責完整的幀數據收發 (幀數據可以獨立在網絡傳輸的數據) mac地址封裝和解封裝,交換器就工作在這一層
  2. git和GitHub關系 它是一個用于 Linux內核開發的版本管理工具,是可以在你電腦不聯網的情況下,只在本地使用的一個版本管理工具,其作用就是可以讓你更好的管理你的程序,比如你原來提交過的內容,以后雖然修改了,但是通過git這個工具,可以把你原來提交的內容重現出來,這樣對于你后來才意識到的一些錯誤的更改,可以進行還原。
  3. 多線程開發帶來的問題與解決方法? 線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程就發生了線程安全問題,表現形式為數據的缺失,數據不一致等。
  4. sleep()方法和wait()方法區別和共同點? - sleep()方法屬于Thread類的靜態方法,作用于當前線程;而wait()方法是Object類的實例方法,作用于對象本身?!? 執行sleep()方法后,可以通過超時或者調用interrupt()方法喚醒休眠中的線程;執行wait()方法后,通過調用notify()或notifyAll()方法喚醒等待線程。
  5. 什么是上下文切換 時間片是CPU分配給各個線程的時間,因為時間片非常短,所以CPU通過不停地切換線程執行,讓我們感覺多個線程是同時執行的。(時間片一般是幾十毫秒) CPU通過時間片分配算法來循環執行任務,當前任務執行一個時間片后會切換到下一個任務。
  6. 為什么程序計數器、虛擬機棧和本地方法棧是線程私有的呢? 1、字節碼解釋器通過改變程序計數器來依次讀取指令,從而實現代碼的流程控制,如:順序執行、選擇、循環、異常處理?!?、在多線程的情況下,程序計數器用于記錄當前線程執行的位置,從而當線程被切換回來的時候能夠知道該線程上次運行到哪兒了。
  7. 四虎成人精品一区二区免费网站