智能運(yùn)營助手線程池原理剖析鎖的深度化_第1頁
智能運(yùn)營助手線程池原理剖析鎖的深度化_第2頁
智能運(yùn)營助手線程池原理剖析鎖的深度化_第3頁
智能運(yùn)營助手線程池原理剖析鎖的深度化_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余9頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

線原理分析&鎖的深度線什么是都可以使用線。在開發(fā)過程中,合理地使用線能夠帶來3個(gè)好處。線作線的分Java資源的,因?yàn)閖ava提供了線。在jdk1.5以前的版本中,線的使用是及其簡陋的,但是在JDK1.5后,有了很大的改善。JDK1.5java.util.concurrent,java.util.concurrentExecutor(JDK1.52004),但是很多程序員對(duì)于其中的一些原理ExecutorThreadPoolExecutor類,ExecutorsnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其實(shí)也只是ThreadPoolExecutor下的線那么它的底層原理是怎樣實(shí)現(xiàn)的呢這篇就來介紹下ThreadPoolExecutor線的運(yùn)行過程corePoolSize:池的大小。當(dāng)有任務(wù)來之后,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù),當(dāng)線中的線程數(shù)corePoolSizeumPoolSize:線最大線程數(shù),它表示中最多能創(chuàng)建多少個(gè)線程keepAliveTime:unit:keepAliveTime7TimeUnit7線四種創(chuàng)建方Java通過Executors(jdk1.5并發(fā)包)提供四種線,分別為newFixedThreadPool創(chuàng)建一個(gè)定長線,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。newScheduledThreadPool創(chuàng)建一個(gè)定長線,支持定時(shí)及周期性任務(wù)執(zhí)行。newSingleThreadExecutor創(chuàng)建一個(gè)單線程化的線,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO,優(yōu)先級(jí))執(zhí)行。創(chuàng)建一個(gè)可緩存線,如果線長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下////無限大小 jvm自動(dòng)回ExecutorServicenewCachedThreadPool=Executors.newCachedThreadPool();for(inti=0;i<10;i++){finalinttemp=i;newCachedThreadPool.execute(newRunnable(){publicvoidrun(){try{}catch(Exceptione)//TODO:handle}System.out.println(Thread.currentThread().getName()+",i:"+}}}總結(jié):線為無限大,當(dāng)執(zhí)行第二個(gè)任務(wù)時(shí)第一個(gè)任務(wù)已經(jīng)完成,會(huì)復(fù)用執(zhí)行第一個(gè)任務(wù)的線程,而不創(chuàng)建一個(gè)定長線,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。示例代碼如下ExecutorServiceExecutorServicenewFixedThreadPool=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newFixedThreadPool.execute(newRunnable(){publicvoidrun()System.out.println(Thread.currentThread().getId()+",i:"+}}總結(jié):因?yàn)榫€大小為3,每個(gè)任務(wù)輸出index后sleep2秒,所以每兩秒打印3個(gè)數(shù)字定長線的大小最好根據(jù)系統(tǒng)資源進(jìn)行設(shè)置。如創(chuàng)建一個(gè)定長線,支持定時(shí)及周期性任務(wù)執(zhí)行。延遲執(zhí)行示例代碼如下ScheduledExecutorServiceScheduledExecutorServicenewScheduledThreadPool=Executors.newScheduledThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newScheduledThreadPool.schedule(newRunnable(){publicvoidrun()System.out.println("i:"+}},3,}表示延遲3秒執(zhí)創(chuàng)建一個(gè)單線程化的線,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO,優(yōu)先級(jí))執(zhí)行。示例代碼如下ExecutorServiceExecutorServicenewSingleThreadExecutor=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++){finalintindex=i;newSingleThreadExecutor.execute(newRunnable(){publicvoidrun(){System.out.println("index:"+index);try{}catch(Exceptione)//TODO:handle}}}注意:結(jié)果依次輸出,相當(dāng)于順序執(zhí)行各個(gè)任務(wù)線原理剖提交一個(gè)任務(wù)到線中,線的處理流程如下2、線判斷工作隊(duì)列是否已滿,如果工作隊(duì)列沒有滿,則將新提交的任務(wù)在這個(gè)工作隊(duì)列里。如合理配置任務(wù)的性質(zhì):CPU,IO置Ncpu+1個(gè)線程的線。IO密集型任務(wù)則由于需要等待IO操作,線程并不是一直在執(zhí)行任務(wù),則配2*NcpuCPUIORuntime.getRuntime().availableProcessors()CPU執(zhí)行,需要注意的是如果一直有優(yōu)先級(jí)高的任務(wù)提交到隊(duì)列里,那么優(yōu)先級(jí)低的任務(wù)可能不能執(zhí)行CPU。I/O前者稱為計(jì)算密集型(CPU)computer-bound,I/O,I/O-boundJava鎖的深度悲觀鎖、樂觀鎖、排他場悲觀鎖與樂觀block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)Select*fromxxxfor重入JAVAsynchronized和publicclassTestimplementspublicclassTestimplementsRunnablepublicsynchronizedvoidget()System.out.println("name:"+Thread.currentThread().getName()+"get();");}publicsynchronizedvoidset()System.out.println("name:"+Thread.currentThread().getName()+"}publicvoidrun(){}publicpublicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();newThread(ss).start();newThread(ss).start();}}publicclassTest02extendsThread{ReentrantLockpublicclassTest02extendsThread{ReentrantLocklock=newReentrantLock();publicvoidget(){}publicvoidset(){}publicvoidrun(){}publicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();new}}讀寫Java(LocksinJava)Lock任何問題,所以應(yīng)該允許多個(gè)線程能在同時(shí)共享資源。但是如果有一個(gè)線程想去寫這些共享資源,不能共存)。這就需要一個(gè)讀/寫鎖來解決這個(gè)問題。Java5java.util.concurrentpublicpublicclassCachestaticMap<String,Object>map=newHashMap<String,Object>();staticReentrantReadWriockrwl=newReentrantReadWriock();staticLockr=rwl.readLock();staticLockw=rwl.wri//獲取一個(gè)key對(duì)應(yīng)的publicstaticfinalObjectget(Stringkey)try{System.out.println("正在做讀的操作,keykey開始Objectobject=System.out.println("正在做讀的操作,keykey結(jié)束");return}catch(InterruptedExceptione)}finally}return}//設(shè)置key對(duì)應(yīng)的value,并返回舊有的publicstaticfinalObjectput(Stringkey,Objectvalue)try{System.out.println("正在做寫的操作,keykey",valuevalue開始.");Objectobject=map.put(key,System.out.println("正在做寫的操作,keykey",valuevalue結(jié)束.");return}catch(InterruptedExceptione)}finally}return}}publicstaticfinalvoidclear()try{}finally}}publicstaticvoidmain(String[]args){newThread(newRunnable(){publicvoidrun()for(inti=0;i<10;i++){Cache.put(i+"",i+"");}}newThread(newRunnable()publicvoidrun()for(inti=0;i<10;i++){Cache.get(i+"");}}}}CAS無鎖機(jī)與鎖相比,使用比較交換(CAS)會(huì)使程序看起來更加復(fù)雜一些。但由于其非阻塞性,它就憑借這兩個(gè)優(yōu)勢(shì),就值得我們嘗試使用無鎖的并發(fā)CAS算法的過程是這樣:它包含三個(gè)參數(shù)CAS(V,E,N):V表示要更新的變量,E表示預(yù)期值,N表示V等于E會(huì)將V設(shè)為N,如果V值和E說明已經(jīng)有其他線程做了更新,則當(dāng)前線程什么都不做。最后,CAS當(dāng)前VCAS操作是抱觀的態(tài)度進(jìn)行的,它總是認(rèn)為自己可以成功完成操作。當(dāng)多個(gè)線程同時(shí)使用CAS敗,并且允許再次嘗試,當(dāng)然也允許失敗的線程放棄操作?;谶@樣的原理,CASCASJDK5.0Atomicallyincrementsbyonethecurrent*@returntheupdatedpublicfinalintincrementAndGet(){for(;;){//intcurrent=//intnext=current+ if(compareAndSet(current,next))returnnext;}}自旋privateAtomicReference<Thread>privateAtomicReference<Thread>sign=newpublicvoidlock()Threadcurrent=whilepareAndSet(null,current))}}publicvoidunlock()Threadcurrent=Thread.currentThread();pareAndSet(current,null);}publicpublicclassTestimplementsRunnable{staticintsum;privateSpinLockpublicTest(SpinLocklock){this.lock=lock;}@param@throwspublicstaticvoidmain(String[]args)throwsInterruptedException{SpinLocklock=newSpinLock();for(i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論