Java多線程開發(fā)視頻教程

Java多線程開發(fā)視頻教程

長沙牛耳教育      2022-03-30 02:30:01     15

Java多線程開發(fā)視頻教程,  目前接觸的多線程編程基本上都是基于java.util.concurrent這個包下的開發(fā)的,下面就以這個包來分析Java的多線程與高并發(fā)  

課程價格 請咨詢

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

詳細(xì)介紹


  目前接觸的多線程編程基本上都是基于java.util.concurrent這個包下的開發(fā)的,下面就以這個包來分析Java的多線程與高并發(fā)



  一、分析面試題


  1.在java中wait和sleep方法的不同?


  最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用于線程間交互,sleep通常被用于暫停執(zhí)行。


  2.創(chuàng)建多線程的三種方法


 ?。?)繼承Thread()


  (2)實現(xiàn)Runnable()接口


 ?。?)實現(xiàn)Callable接口


  3.繼承Thread與實現(xiàn)Runnable區(qū)別


  類可能只要求可執(zhí)行即可,因此繼承整個Thread類的開銷過大


  4.Runnable和Callable的區(qū)別


  Runnable接口中的run()方法的返回值是void;而Callable接口中的call()方法是有返回值的,和Future/FutureTask配合可以用來獲取異步執(zhí)行的結(jié)果。


  5.notify作用


 ?。?)notify:喚醒一個正在wait當(dāng)前對象鎖的線程,并讓它拿到對象鎖


 ?。?)notifyAll:喚醒所有正在wait前對象鎖的線程


  (3)在調(diào)用wait,notify,notifyall的時候當(dāng)前線程必須獲得這個對象的鎖。


  6.線程的5種狀態(tài)



  7.你有哪些多線程開發(fā)良好的實踐


  (1)考慮使用線程池


 ?。?)優(yōu)先使用volatile保證可見性


  (3)最小化同步范圍


 ?。?)給線程命名


  二、說說java5以后提供多線程的東西:


  ExecutorServicecachedThreadPool=Executors.線程池方法


  1.Java通過Executors提供四種線程池:


  newCachedThreadPool創(chuàng)建一個可緩存線程池,需要就增加,不需要就減少。


  newFixedThreadPool創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。


  newSingleThreadExecutor創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO,優(yōu)先級)執(zhí)行。


  newScheduledThreadPool創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。(這個一般不用:一般框架就會有定時器)


  2.同步工具


  Semaphone(信號量)可以將任何一種容器變?yōu)橛薪缱枞萜鳎罕热绶?wù)器登錄人數(shù)過多排隊等待。


  CyclicBarrier(循環(huán)屏障)他可以做出讓幾個線程都執(zhí)行到某個地方之后,才讓幾個線程同時繼續(xù)執(zhí)行。


  CountDownLatch(倒計時鎖)這個類能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行。


  ReentrantLock(重入鎖)把鎖機(jī)制分為讀鎖、寫鎖;讓鎖更靈活


  Condition用于讓指定線程等待與喚醒,按預(yù)期順序執(zhí)行,他必須和ReentrantLock重入鎖配合使用。


  Callable配合Future/FutureTask獲取線程信息。


  3.原子對象


  AtomicInteger、AtomicLong、AtomicBoolean(Atomic則通過CAS(樂觀鎖)實現(xiàn)自動同步)


  主要是i++不是原子操作,非線程安全的,多線程訪問的時候需要用到synchronized關(guān)鍵字保持線程同步。synchronized是悲觀鎖,在多線程競爭下,加鎖、釋放鎖會導(dǎo)致比較多的上下文切換和調(diào)度延時,代價就是效率低下


  4.并發(fā)容器


  CopyOnWriteArrayList(寫復(fù)制列表)


  CopyOnWriteArraySet(寫復(fù)制集合)


  底層實現(xiàn)主要是操作時復(fù)制了一份出來,底層采用的是重入鎖解決并發(fā)更改問題。


  ConcurrentHashMap(分段鎖映射)


  hashtable鎖住的是一整張hash表而ConcurrentHashMap底層默認(rèn)分段分成16份分別鎖住,利用樂觀鎖來操作效率問題。


  ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentlinkedQueue、這三個都是有序的支持并發(fā)的。


  具體可以看Jdk文檔


  三、分布式鎖的實現(xiàn)方案


  1.tair


  incr和decr操作,相當(dāng)于是樂觀鎖


  2.Redis/memcache


  setNx命令


  3.Zookeeper


  充分利用watcher機(jī)制,創(chuàng)建臨時結(jié)點(diǎn),誰創(chuàng)建成功,誰就獲得當(dāng)前的鎖


  4.數(shù)據(jù)庫:利用數(shù)據(jù)庫的行鎖


  //加鎖SQL


  updatetrade_basesetstatus=1wheretrade_no=“XXX”andstatus=0;


  //解鎖SQL


  updatetrade_basesetstatus=0wheretrade_no=“XXX”andstatus=1;


  注意trade_base表上一要有trade_no的列的唯一索引


  當(dāng)然具體用那種分布鎖,還需要結(jié)合業(yè)務(wù)自身的需要,一般來說,在并發(fā)量不是別大,數(shù)據(jù)庫完全可以扛得住的情況下,用數(shù)據(jù)庫實現(xiàn)分布鎖最快,最方便,而且性能的損失也非常地?。?/p>


  當(dāng)然現(xiàn)在很多場景下,都是分庫分表,并且加鎖和解鎖分別都只影響一行,對數(shù)據(jù)庫來說,加鎖和解鎖的sql也是非常輕量的sql操作,因此在性能損失上不用過多的擔(dān)心。



    以上就是長沙牛耳教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java多線程開發(fā)視頻教程”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。


Java視頻教程

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