日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

谈一谈Java编程开发中的并发控制

發(fā)布時(shí)間:2024/7/23 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈一谈Java编程开发中的并发控制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

并發(fā)指在宏觀上的同一時(shí)間內(nèi)同時(shí)執(zhí)行多個(gè)任務(wù)。為了滿足這一需求,現(xiàn)代的操作系統(tǒng)都抽象出?線程?的概念,供上層應(yīng)用使用。

這篇博文不打算詳細(xì)展開分析,而是對java并發(fā)中的概念和工具做一個(gè)梳理。
沿著并發(fā)模型、并發(fā)要解決的問題、基本工具、衍生工具這一思路展開。

<!-- more -->

線程

首先線程是什么?線程是由OS抽象并實(shí)現(xiàn)的,我們知道OS的職責(zé)是管理并合理分配硬件資源,那么OS為了更好的管理、分配CPU資源,同時(shí)也為了滿足同時(shí)執(zhí)行任務(wù)這一需求,設(shè)計(jì)了線程這一概念。

雖然java程序運(yùn)行在JVM虛擬機(jī)上,但是java的線程仍然是對操作系統(tǒng)原生線程的封裝,同時(shí),jvm對線程實(shí)現(xiàn)時(shí)也將jvm的運(yùn)行棧設(shè)計(jì)成線程私有內(nèi)存,因此,java線程和原生線程在理解上實(shí)際上沒太大區(qū)別。

線程的五種狀態(tài):

graph LR 新建 --> 就緒; 就緒 --> 運(yùn)行; 運(yùn)行 --> 就緒; 運(yùn)行 --> 阻塞; 阻塞 --> 就緒; 運(yùn)行 --> 死亡;

先來看上面的就緒狀態(tài)和運(yùn)行狀態(tài)。我們知道線程雖然宏觀上是同時(shí)執(zhí)行的,但是微觀上使用如時(shí)間片輪轉(zhuǎn)算法使得線程依次執(zhí)行。那么,同一時(shí)間只有一個(gè)線程執(zhí)行,其它需要執(zhí)行的線程處于?就緒隊(duì)列?中,等待自己被調(diào)度到。

而如果線程想要暫時(shí)放棄在CPU上運(yùn)行的權(quán)利,就會阻塞自己。這時(shí)對應(yīng)著阻塞狀態(tài),同時(shí)線程會從就緒隊(duì)列中移除,進(jìn)入等待隊(duì)列。
很顯然,阻塞線程被喚醒肯定是進(jìn)入就緒隊(duì)列等待調(diào)度,而不可能是直接分配到CPU上運(yùn)行。

在線程同步時(shí),線程可能由于以下情況被阻塞:

  • 同步阻塞。就是被鎖阻塞。
  • 等待阻塞。被條件變量阻塞。
  • 其它。調(diào)用sleep(), join()或等待IO操作時(shí)的阻塞。
  • 并發(fā)需要解決的問題

    功能性問題

    線程同步面臨兩個(gè)問題,想象下有兩個(gè)線程在協(xié)作工作完成某項(xiàng)任務(wù)。那么需要解決以下問題:

  • 線程兩個(gè)線程之間交互數(shù)據(jù),必然涉及到數(shù)據(jù)共享。而某些數(shù)據(jù)資源無法被多個(gè)線程同時(shí)使用(臨界區(qū)),這時(shí)需要,即線程互斥問題。
  • 假如一個(gè)線程進(jìn)行的太快,另外一個(gè)線程就需要等等它,即線程同步問題。
  • 性能和可用性問題

    在多線程程序的性能問題上,如果是對于同樣一段臨界區(qū)的多線程訪問,那么則有以下幾個(gè)思路:

  • 互斥鎖。互斥鎖即保證同一時(shí)間只有一個(gè)線程訪問臨界區(qū)并完整執(zhí)行完,其它線程在臨界區(qū)外面等待。
  • 無障礙或無鎖。線程們一開始直接進(jìn)入臨界區(qū)執(zhí)行,注意其中不能修改共享數(shù)據(jù)。執(zhí)行完后再判斷剛才這段時(shí)間是否有其它線程執(zhí)行,沒有的話才修改共享數(shù)據(jù),如果有的話就回滾重來。
  • 降低鎖粒度。也即將這個(gè)大的臨界區(qū)拆分成幾個(gè)小的臨界區(qū),分別加互斥鎖控制,這樣提高了線程同時(shí)訪問的臨界區(qū)的機(jī)會變多,性能提高。顯然這要對代碼仔細(xì)推敲,考慮如何拆分鎖粒度而不影響整體的語義。
  • 以上三種思路的性能優(yōu)劣沒有一個(gè)普適的結(jié)果,和具體的場景相關(guān)。

    并發(fā)中還會出現(xiàn)以下幾種情況導(dǎo)致系統(tǒng)不可用:

  • 死鎖。不解釋。
  • 饑餓。線程調(diào)度算法如果不是平等分配的,那么就可能出現(xiàn)優(yōu)先級高的線程長時(shí)間占用CPU,導(dǎo)致優(yōu)先級低的線程無法得到執(zhí)行機(jī)會。
  • 活鎖。這個(gè)我解釋不來。。。
  • 并發(fā)代碼的幾個(gè)性質(zhì)

    并發(fā)編程中需要考慮的幾個(gè)概念:

  • 原子性:指某個(gè)操作一旦被某個(gè)線程執(zhí)行,直到該操作執(zhí)行完畢都不會有其它線程來干擾。
  • 可見性:指某個(gè)變量或某塊內(nèi)存如果被A線程修改,B線程能否馬上讀取到修改后的值。
  • 有序性:A線程執(zhí)行的代碼序列,在B線程看來是否是有序的。
  • 從我個(gè)人的理解來看,原子性屬于由并發(fā)和線程這一理論概念自然而然推導(dǎo)衍生而來的概念,而可見性和有序性是具體的工程實(shí)踐中產(chǎn)生的。
    實(shí)際中,jvm并不能實(shí)現(xiàn)的特別完美,總會有工程上的妥協(xié)。理論模型與實(shí)際模型無法完美契合,總存在一定的偏差。
    比如說,jvm為了向性能妥協(xié)使用了緩存機(jī)制,犧牲了數(shù)據(jù)一致性,這就產(chǎn)生了可見性的概念,需要程序員編程時(shí)自己控制。
    jvm為了指令更高效率的執(zhí)行進(jìn)行了指令重排優(yōu)化,則產(chǎn)生了有序性的問題。印象里以前大學(xué)里學(xué)過的CPU的流水線技術(shù),為了指令能夠更好的被CPU流水線利用,減少流水線的空閑時(shí)間,編譯器編譯時(shí)也會在不影響?串行語義?的前提下,進(jìn)行指令重排。
    總而言之,這是在性能和理論模型完整性之間的一種妥協(xié)。

    并發(fā)的工具

    技術(shù)上的工具、概念繁多復(fù)雜,但是如果我們能理解技術(shù)設(shè)計(jì)上無時(shí)無刻的不運(yùn)用抽象和分層的手段,
    那么,我們可以把技術(shù)上的工具分為兩種:

  • 最基本的、原生的工具。
  • 在原生提供的工具上,進(jìn)行封裝得到的更高層次的工具。
  • 更高層次的工具對基礎(chǔ)工具進(jìn)行了抽象和封裝,屏蔽了其中的實(shí)現(xiàn)細(xì)節(jié)。
    這里想強(qiáng)調(diào)的是,工具的接口實(shí)現(xiàn)是分開的,兩者可以沒有關(guān)系。
    如java的監(jiān)視器鎖從接口上來看,其語義和互斥鎖一樣。然而它并不一定使用互斥鎖實(shí)現(xiàn),而是可以為了性能存在優(yōu)化,只要最終的行為與接口相同即可。

    基本工具

    鎖、條件變量、信號量

    有三種用于線程同步的工具:

  • 鎖。鎖可用于規(guī)定一個(gè)?臨界區(qū),同一時(shí)間臨界區(qū)內(nèi)僅能由一個(gè)線程訪問。其他線程則在臨界區(qū)外等待(阻塞)。
    • 互斥鎖。使用信號量實(shí)現(xiàn)。臨界區(qū)外等待的線程會被阻塞。
    • 自旋鎖。臨界區(qū)外等待的線程會忙等。

    ?

  • 條件變量(Condition)。線程在某種條件不滿足時(shí)阻塞自己,等待其它的線程條件滿足時(shí)再喚醒它們。很顯然所有等待的線程要放入一個(gè)數(shù)據(jù)結(jié)構(gòu)中,這個(gè)數(shù)據(jù)結(jié)構(gòu)就在條件變量內(nèi)。
  • 信號量。操作系統(tǒng)原生的機(jī)制。實(shí)際上,鎖 + 條件變量可完成所有信號量可以完成的邏輯。
  • 在java中,Object類有wait()、notify()和notifyAll()之類的方法。
    這些方法可以認(rèn)為每個(gè)對象都內(nèi)置了一個(gè)條件變量,而這些方法是對這些條件變量的操作,因此,可以使用這些方法將對象當(dāng)作條件變量使用,從而做到線程的同步。

    為了讓學(xué)習(xí)變得輕松、高效,今天給大家免費(fèi)分享一套Java入門教學(xué)資源。幫助大家在成為Java架構(gòu)師的道路上披荊斬棘。需要資料的歡迎加入學(xué)習(xí)交流群:9285,05736

    總結(jié)

    以上是生活随笔為你收集整理的谈一谈Java编程开发中的并发控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 小明看国产 | 一区二区三区不卡视频在线观看 | 日本wwwwwww| 国产精品一区二区黑人巨大 | 那个网站可以看毛片 | 欧洲最强rapper网站直播 | 亚洲精品一区二区三区四区 | 欧美成人a∨高清免费观看 国产精品999视频 | 午夜一级在线 | 欧美一级色片 | 日韩成人免费在线视频 | 91久久久久久久久久久久久 | 国产精品高潮呻吟久久久久久 | 鲍鱼av在线| 久久成人久久 | 国产精九九网站漫画 | 亚洲精品一区二区三区新线路 | 亚洲精品免费在线观看 | 大尺度做爰呻吟舌吻网站 | 一区不卡在线观看 | 在线观看精品视频 | 国产美女无遮挡免费视频 | 日韩精品一区二区三区在线视频 | 欧美做受高潮 | 欧美日韩高清在线播放 | 国产亚洲欧美一区二区三区 | av在线免费不卡 | 欧美大片一区二区 | 国产高清一区二区三区四区 | 久久久久久久久久久久久久久久久久久久 | 国产微拍精品一区 | 欧美一级黄色片在线观看 | 韩国视频一区 | 丰满人妻一区二区三区在线 | 午夜手机福利 | 精品资源成人 | 最新的黄色网址 | 免费观看黄色一级视频 | 国内偷拍一区二区 | 日韩亚洲一区二区三区 | 另类ts人妖一区二区三区 | 国产片久久 | 天天综合亚洲 | 女女h百合无遮羞羞漫画软件 | 欧美精品一区二区在线观看 | 日本天堂影院 | 怡红院av在线 | 波多野42部无码喷潮在线 | 国产三级aaa | 99久久精品免费看国产四区 | 男人的天堂色偷偷 | 欧美日韩黄色 | 黄色av电影网站 | av2014天堂网| 漂亮人妻洗澡被公强 日日躁 | 中文字幕人妻一区二区 | 国产精品99久久久久久久 | 日本一区二区三区电影在线观看 | 亚洲社区在线观看 | 高h调教冰块play男男双性文 | 神马福利视频 | 青青草视频播放 | 欧美一级高潮片 | 成人一二三四区 | 日本黄色播放器 | 台湾三级伦理片 | 热久久免费视频 | 亚洲最大的网站 | 一级片福利 | 成人欧美一区二区三区黑人免费 | 久久免费视频1 | 大乳丰满人妻中文字幕日本 | 日本xxxx人 | 国产超碰av| 国产视频一区二区在线 | 欧美精品观看 | 一级欧美一级日韩片 | 三级黄色在线 | 欧美一区二区三区激情视频 | 天堂在线精品 | 亚洲男人第一天堂 | 亚洲色偷精品一区二区三区 | 2019毛片 | 波多野结衣视频在线观看 | 国产jk精品白丝av在线观看 | 国产又爽又黄的视频 | 黄色小视频在线免费观看 | 超碰成人免费在线 | 亚洲爱爱av | 日本人极品人妖高潮 | 伊人免费在线观看高清版 | 欧美一区二区视频在线观看 | 国产一级不卡毛片 | 日韩电影在线观看中文字幕 | 欧美日韩黄色一级片 | 欧美精品二区三区 | 久久精品无码一区二区三区免费 | 国产性av| 日本一区二区三区免费看 |