Java培訓(xùn)教程:Java多線程并發(fā)教程

Java培訓(xùn)教程:Java多線程并發(fā)教程

深圳達(dá)內(nèi)教育      2022-05-01 15:14:01     33

Java培訓(xùn)教程:Java多線程并發(fā)教程,  多線程  提高了程序的執(zhí)行效率,多線程同時執(zhí)行,因此具有不確定性  提高了資源利用率,CPU、內(nèi)存等  占用一定的內(nèi)存

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細(xì)介紹



  多線程


  提高了程序的執(zhí)行效率,多線程同時執(zhí)行,因此具有不確定性


  提高了資源利用率,CPU、內(nèi)存等


  占用一定的內(nèi)存空間


  線程越多CPU的調(diào)度開銷越大


  程序的復(fù)雜度會上升


  線程池


  避免線程的創(chuàng)建和銷毀帶來的性能開銷(少開銷)


  加快響應(yīng)速度。任務(wù)到達(dá)時不用創(chuàng)建線程,直接使用線程池中的


  避免大量的線程間因互相搶占系統(tǒng)資源而阻塞的現(xiàn)象(避免阻塞)


  能對線程進(jìn)行簡單的管理并提供定時執(zhí)行、間隔執(zhí)行等功能(便于管理)


  sleep和wait


  sleep是使線程停止一段時間的方法,線程不會釋放對象鎖.在sleep一段時間后,線程不一定立刻回復(fù)執(zhí)行


  wait是線程交互的時候,如果線程對一個同步對象發(fā)出wait調(diào)用,該線程會立刻暫停執(zhí)行.進(jìn)入等待狀態(tài),直到被喚醒,線程會放棄對象鎖,使得其他線程可以使用同步控制塊或者方法


  多線程和并發(fā)


  run和start的區(qū)別:


  調(diào)用 start() 方法才會啟動新線程;如果直接調(diào)用 Thread 的 run() 方法,它的行為就會和普通的方法一樣;為了在新的線程中執(zhí)行我們的代碼,必須使用 Thread.start() 方法。run只是thread的一個普通方法,start是真正的啟一個線程


  關(guān)鍵字


  可見性


  可見性,是指線程之間的可見性,一個線程修改的狀態(tài)對另一個線程是可見的.也就是一個線程修改的結(jié)果。另一個線程馬上就能看到

  在 Java 中 volatile、synchronized 和 final 實(shí)現(xiàn)可見性


  原子性


  將操作變成原子操作


  在 Java 中 synchronized 和在 lock、unlock 中操作保證原子性


  有序性


  Java 語言提供了 volatile 和 synchronized 兩個關(guān)鍵字來保證線程之間操作的有序性


  wait和sleep


  sleep


  在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行),該線程不丟失任何監(jiān)視器的所屬權(quán),sleep() 是 Thread 類專屬的靜態(tài)方法,針對一個特定的線程。


  wait


  方法使實(shí)體所處線程暫停執(zhí)行,從而使對象進(jìn)入等待狀態(tài),導(dǎo)致線程進(jìn)入等待狀態(tài),直到它被其他線程通過notify()或者notifyAll喚醒,該方法只能在同步方法中調(diào)用。


  比較


  本質(zhì)的區(qū)別:sleep是線程的運(yùn)行狀態(tài)控制,wait是線程之間的通訊


  sleep是Thread中的方法,wait是Object中的方法


  wait() 方法進(jìn)入等待狀態(tài)時會釋放同步鎖。調(diào)用的時候需要先獲得該 Object 的鎖,調(diào)用 wait 后,會把當(dāng)前的鎖釋放掉同時阻塞住。而 sleep() 方法不會釋放同步鎖。


  sleep讓線程從運(yùn)行到阻塞,wait讓線程從運(yùn)行到等待隊(duì)列


  wait要用notify和notify喚醒,只能在同步環(huán)境中使用,sleep可以在任何環(huán)境中使用


  notify notifyall


  notify


  隨機(jī)選擇一個在該對象上調(diào)用wait方法的線程,解除其阻塞狀態(tài),該方法只能在同步方法或同步塊內(nèi)部調(diào)用。


  notifyall


  解除所有那些在該對象上調(diào)用wait方法的線程的阻塞狀態(tài),同樣該方法只能在同步方法或同步塊內(nèi)部調(diào)用。


  synchronized


  是一種同步鎖(CPU悲觀鎖),java并發(fā)編程的最常用的用于保證線程安全的方式,所有加上 synchronized 的方法和塊語句,在多線程訪問的時候,同一時刻只能有一個線程能夠訪問。


  修飾實(shí)例方法


  作用于當(dāng)前實(shí)例加鎖,進(jìn)入同步代碼前要獲得當(dāng)前實(shí)例的鎖。


  實(shí)例方法不包括靜態(tài)方法


  修飾靜態(tài)方法


  作用于當(dāng)前類對象加鎖,進(jìn)入同步代碼前要獲得當(dāng)前類對象的鎖。靜態(tài)成員不專屬于任何一個實(shí)例對象,是類成員,因此通過class對象鎖可以控制靜態(tài)成員的并發(fā)操作


  修飾代碼塊


  指定加鎖對象,對給定對象加鎖,進(jìn)入同步代碼庫前要獲得給定對象的鎖。


  Lock


  采用樂觀鎖


  能完成synchronized所實(shí)現(xiàn)的所有功能,Lock有比synchronized更精確的線程語義和更好的性能。Lock的鎖定是通過代碼實(shí)現(xiàn)的,而synchronized是在JVM層面上實(shí)現(xiàn)的,synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強(qiáng)大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。Lock鎖的范圍有局限性,塊范圍,而synchronized可以鎖住塊、對象、類。在加鎖和解鎖處需要通過lock()和unlock()顯示指出


  volatile


  Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。volatile 是一個特殊的修飾符,只有成員變量才能使用它。在Java并發(fā)程序缺少同步類的情況下,多線程對成員變量的操作對其它線程是透明的。volatile 變量可以保證下一個讀取操作會在前一個寫操作之后發(fā)生。線程都會直接從內(nèi)存中讀取該變量并且不緩存它。這就確保了線程讀取到的變量是同內(nèi)存中是一致的。


  volatile


  能保證可見性,不能保證原子性


  當(dāng)對非 volatile 變量進(jìn)行讀寫的時候,每個線程先從內(nèi)存拷貝變量到CPU緩存中。如果計(jì)算機(jī)有多個CPU,每個線程可能在不同的CPU上被處理,這意味著每個線程可以拷貝到不同的 CPU cache 中。而聲明變量是 volatile 的,JVM 保證了每次讀變量都從內(nèi)存中讀,跳過 CPU cache 這一步。


  輕量級的 synchronized


  Volatile變量的同步性較差(但有時它更簡單并且開銷更低),而且其使用也更容易出錯。


  volatile 并不完全是線程安全的


  用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的值。volatile很容易被誤用,用來進(jìn)行原子性操作。


  訪問最新值


  Volatile修飾的成員變量在每次被線程訪問時,都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而不是從各個線程的“工作內(nèi)存”。而且,當(dāng)成員變量發(fā)生變化時,強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。


  效率問題


  synchronized關(guān)鍵字是防止多個線程同時執(zhí)行一段代碼,那么就會很影響程序執(zhí)行效率,而volatile關(guān)鍵字在某些情況下性能要優(yōu)于synchronized


  volatile關(guān)鍵字是無法替代synchronized關(guān)鍵字的,因?yàn)関olatile關(guān)鍵字無法保證操作的原子性。


  JAVA高級


  對象序列化


  很多情況下,對象內(nèi)部狀態(tài)是需要被持久化的,將運(yùn)行中的對象狀態(tài)保存下來(最直接的方式就是保存到文件系統(tǒng)中),在需要的時候可以還原,即使是在Java虛擬機(jī)退出的情況下


  對象序列化機(jī)制是Java內(nèi)建的一種對象持久化方式,可以很容易實(shí)現(xiàn)在JVM中的活動對象與字節(jié)數(shù)組(流)之間進(jìn)行轉(zhuǎn)換,使用得Java對象可以被存儲,可以被網(wǎng)絡(luò)傳輸,在網(wǎng)絡(luò)的一端將對象序列化成字節(jié)流,經(jīng)過網(wǎng)絡(luò)傳輸?shù)骄W(wǎng)絡(luò)的另一端,可以從字節(jié)流重新還原為Java虛擬機(jī)中的運(yùn)行狀態(tài)中的對象



       以上就是深圳達(dá)內(nèi)教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java培訓(xùn)教程:Java多線程并發(fā)教程”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。


       相關(guān)文章


  零基礎(chǔ)怎么自學(xué)Java,完整版Java學(xué)習(xí)路線圖


  你還在糾結(jié)學(xué)Java,是自學(xué)還是去培訓(xùn)班嗎


  一個標(biāo)準(zhǔn)的Java程序員如何進(jìn)階?


  Java學(xué)習(xí)路線清單,快速進(jìn)階Java


  Java編程初學(xué)者要如何進(jìn)階


Java培訓(xùn) Java培訓(xùn)教程 Java教程

培訓(xùn)啦提醒您:交易時請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險,謹(jǐn)防上當(dāng)。