基礎增強第4天java高級特性_第1頁
基礎增強第4天java高級特性_第2頁
基礎增強第4天java高級特性_第3頁
基礎增強第4天java高級特性_第4頁
基礎增強第4天java高級特性_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1java34JVMjava.1.javaQQ這個軟件運行時所分配的內容的獨立空間中。cpu做時間片的切換其實真正電腦中的程序的運行不是同時在運行的。CPU負責程序的運行,而CPU在運行程序的過某個時刻點上,它其實只能運行一個程序。而不是多個程序。而CPU它每個程序就是進程,而每個進會有多個線程,而CPU是在這些線程之間進行切換。1ThreadMyThreadWithExtends2、實現(xiàn)Runnable接口的.2.java同步解synchronized(需要一個任意的對象(鎖)}synchronized是javaJavaIO或者其他原因(sleep方法)被阻塞了,時間或者能夠響應中斷),Lock就可以辦到。Lock就可以辦到。Locksynchronized無法辦到的??偟膩碚f,也就是說Lock提供了比synchronized的功能。2.2locksynchronizedLocksynchronizedsynchronized不需要用戶去手動釋Lock則必須要用戶去手動釋放鎖,如果沒有主動釋放鎖,就有可能導致出現(xiàn)publicinterfaceLock{voidlock();voidlockInterruptibly()publicinterfaceLock{voidlock();voidlockInterruptibly()throwsInterruptedException;booleantryLock();booleantryLock(longtime,TimeUnitunit)throwsInterruptedException;voidunlock();}Locklock()、tryLock()、tryLock(longtime,TimeUnitunit)、lockInterruptibly()是用來獲取鎖的。由于面講到如果采用Lock,必須主動去釋放鎖,并且在發(fā)生異常時,不會自動釋Lock必須在try{}catch{}finally果獲取失?。存i已被其他線程獲取),則返回false,也就說這個方法無論如何都會立即tryLock(longtime,TimeUnitunit)tryLock()方法是類似的,只不過區(qū)別在于這個方法在拿不到鎖時會等待一定的時間,在時間期限之內如果還拿不到鎖,就返回false。如果true。lckIetily方法比較特殊,當通過這個方法去獲取鎖時,如果線程正在等待獲取鎖,則這個線程能夠響應中斷,即中斷線程的等待狀態(tài)。也就使說,當兩個線程同時通過lck.ckIetilyAB那么對線程B調用teadB.etB現(xiàn)了Lock接口的類,并且ReentrantLock提供了的方法,ReentrantLock,意思是ReentrantLock的使用案例:1,lock()的正確使用方法2,tryLock()的使用方法MyTryLockMyInterruptiblypublicinterface ockpublicinterface ockReturnsthelockusedfor*@returnthelockusedforLockReturnsthelockusedfor@returnthelockusedforLock }現(xiàn)了ReadWriock接口。ReentrantReadWriock里面提供了很多豐富的方法,不過最主要的有兩個方法例子 果LocksynchronizedLocksynchronizedJava中的關鍵字,synchronized是內置的語言synchronized在發(fā)生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現(xiàn)象發(fā)LockunLock()去釋放鎖,則很可能造成死鎖現(xiàn)象,Lockfinallyjava.1.javaJDK5.0java.util.concurrent包中,51SingleThreadExecutor:只有一個線程的線程池,因此所有提交的任務是順序執(zhí)行,代碼:Executors.newSingleThreadExecutor()2CachedThreadPool:線程池里有很多線程需要同時執(zhí)行,老的可用線程將被新的任務觸60秒內沒執(zhí)行,那么將被終止并從池中刪除,3FixedThreadPool:代碼:Executors.newFixedThreadPool(4)4cpu的數(shù)量保持一致,獲取cpuintcpuNums=Runtime.getRuntime().availableProcessors();4ScheduledThreadPool:用來調度即將執(zhí)行的任務的線程池,5SingleThreadScheduledPool:只有一個線程,用來調度執(zhí)行將來的任務,代碼:RunnableFutureCallableFuture實例表示任務的狀態(tài).2.javaBlockingQueuejava.util.concurrent下的主要用來控制線程同步的工具。主要的方法是:put、take一對阻塞存??;add、poll一對非阻塞存取。插入add(anObject):anObject加到BlockingQueue里,即如果BlockingQueue可以容納,true,否則拋出offer(anObject):表示如果可能的話,將anObject加到BlockingQueue里,BlockingQueue可以容納,則返回true,put(anObject):anObjectBlockingQueue里,BlockQueue沒有空間,則調BlockingQueue里面有空間再繼續(xù). take():BlockingQueue里排在首位的對象,BlockingQueue為空,阻斷進入等待狀態(tài)直到Blocking有新的對象被加入為止據(jù)可能booleanremove(Objecto);從隊列移除元素,如果存在,即移除一個或者,隊列改truepublicbooleancontains(Objecto);查看隊列是否存在這個元素,存在返回intdrainTo(Collection<?superE>c);傳入的集合中的元素,如果在隊列中存在,那么將intdrainTo(Collection<?superEcintmaxElements);和上面方法的區(qū)別在于,制定了移int參數(shù)來指明其大小.FIFO(先入先出)順序排序的。2、LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數(shù)帶一個規(guī)定大小的參數(shù),生成的BlockingQueue有大小限制,若不帶大小參數(shù),所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.FIFO(先入先出)順序排序的。LinkedBlockingQueue可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,puttake方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。LinkedBlockingQueueArrayBlockingQueue比較起來,它們背后所用的數(shù)據(jù)結構不一樣,導致LinkedBlockingQueue的數(shù)據(jù)吞吐量要大于ArrayBlockingQueue,但程數(shù)量很大時其性能的ArrayBlockingQueue.javaJMS.1.步通信。JavaAPI,絕大多數(shù)MOMJMS提供JMS是一種與廠商無關的API,用來消息收發(fā)系統(tǒng)消息。它類似于JDBC(JavaDatabaseConnectivity):這里,JDBC是可以用來許多不同關系數(shù)據(jù)庫的API,而JMS則提供同樣與廠商無關的方法以消息收發(fā)服務許多廠商都支持JMS,包括IBM的MQSeriesBEAWeblogicJMSserviceProgressSonicMQ,這只是幾個例子。JMS使您能夠通過消息收發(fā)服務(有時稱為消息中介程序或路由器)JMS客戶機向另一個JMSJMS中的一種類型對象,由兩部分組成:報頭和消息主體。(TextMessage)、可序列化的對象(ObjectMessage)、屬性集合(MapMessage)、字節(jié)流(BytesMessage)、原始值流(StreamMessage),還有無有效負載的消息(Message)。.2.JMSJMS(JavaMessagingService)Java平臺上有關面向消息中間件(MOM)的技術規(guī)范,它便Java應用程序進行消息交換,并且通過提供標準的產生、發(fā)送、接收消息的Java消息服務。JMSJMSJMSJMSJMSJMSJMSJMS隊列:一個容納那些被發(fā)送的等待閱讀的消息的區(qū)域。與隊列名字所暗示的意思不同,Java中消息。這里,生產者知道消費者的隊列,并直接將消息發(fā)送到消費者的隊列。發(fā)布者/訂閱者模型支持向一個特定的消息發(fā)布消息。0或多個訂閱者可能對接收來自比是公告板。Java語言,JMSJava類可以通過JNDI中關于提供者的信息,連接不同的JMS提供者。這一組類首先使用接工廠ActiveMQ去 QueueJMSJavaJMS提供者,管理會話和隊列。既有開源的提供者ApacheJBossHornetQCoridanTheOpenJMSGroupBEABEAWebLogicServerJMSTIBCOSoftwareEMSGigaSpaces的GigaSpacesSoftwired2006iBusIONA的IONASeeBeyondIQManager(20058SunMicrosystems并購webMethodsJMSmy-channelsNirvanaSonicSoftwareSonicMQSwiftMQSwiftMQIBM的WebSpherejavaJVM.1.java工具使jconsole是一種集成了上面所有命令功能的可視化工具,可以分析jvm的內存使用情況JDK/bin下的“jconsole.exeJconsole后,將自動搜索出本機運行的所有虛擬機進程,不需要用戶使用jps來查詢了,雙擊其中一個進程即可開始。也可以“連接服務器,進行虛擬機的?!碧峁┝撕蚸console.2.javaJava虛擬機在執(zhí)行Java程序的過,會把它所管理的內存劃分為若干個不同的數(shù)據(jù)如上圖所示,Java虛擬機運行時數(shù)據(jù)區(qū)域被分為五個區(qū)域:堆(Heap)、棧(Stack)、本地方法棧(NativeStack)、方法區(qū)(MethodArea)、程序計數(shù)器(ProgramCountRegister)。堆對于大多數(shù)應用來說,JavaHeapJava虛擬機管理的內存的最大一塊,這塊區(qū)域隨著JavaHeap是一塊共享的區(qū)域,操作共享區(qū)域的成與JavaHeap相關的還有Java的回收機制(GC),JavaHeap是回收器管理的主要區(qū)域。程序猿所熟悉的、老生代、永久代的概念就是在堆里面,現(xiàn)在大多數(shù)的GC基本都采用了分代收集算法。如果再細致一點,JavaHeapEden空間,F(xiàn)romSurvivor空間,ToSurvivor空間等。棧Java方法執(zhí)行時的內存模型,每個方法執(zhí)行時都會創(chuàng)建一個棧幀(StackFrame)型,對象等信息。本地方法棧(Native本地方法棧(NativeStack)與Java虛擬(JavaStack)所發(fā)揮的作用非常相似,他java方法(也就是字節(jié)碼)服務,而本地方法Native方法服務。方法區(qū)(Method方法區(qū)(MethodArea)與堆(JavaHeap)一樣,是各個線程共享的內存區(qū)域,它用于虛擬機加載的類信息,常量,靜態(tài)變量,即時編譯器編譯后的代碼等數(shù)據(jù)。雖然JavaJava虛擬機棧(JavaStack)本地方法棧(NativeStack)2堆(JavaHeap).3.GC.3.2.算法2、當這一塊的內存用完了,就將還存活著的對象到另外一塊上面,然后再把已使用過.3.3.標記-整理算法 1.3.4.分代收集算法(Generational3、在中,每次收集時都發(fā)現(xiàn)有大批對象死去,量存活,那就選用算法,只需要付出少量存活對象的成本就可以完成收集。.4.回收Serial1、是一個單線程的收集器,“StopTheSerialOld JDK1.5ParallelScavenge收集器搭配使用ParNew2CPU3、Server模式下首選,目前只有它能與CMS收集器配合工4、使用-XX:+UseConcMarkSweepGC選項后的默認收集器,也可以使用-2、收集器,算法,并行的多線程收集4、吞吐量=運行用戶代碼時間/(運行用戶代碼時間+收集時間),虛擬機總共運行100分鐘,其中收集花掉1分鐘,那吞吐量就是99%-XX:+UseAdaptiveSize:動態(tài)設置大小、Eden與Survivor區(qū)的比例、晉升老年代對象ParallelOld2CPUParallelScavenge加ParallelCMS2、非常符合互聯(lián)或者B/S系統(tǒng)的服務端上,重視服務的響應速度,希望系統(tǒng)停頓時間重新標記,StopTheWorld并發(fā)清除(CMSconcurrentsweep)7 Failure1、收集器技術發(fā)展的最前沿成果之2、G1是一個適用于服務器端、大內存、多CPU情景的收集器,主要目標是在維持高效率回收(highthoughput)的同時,提供軟實時中斷特性。用戶可以指定一個時間上限,如果回收導致的程序暫停超過了用戶設定的時間上限,會打斷回收,恢復程序的執(zhí)行。M初始標記:標記一下GCRoots能直接關聯(lián)到的對象,需要停頓線程,但耗時很短GCRoot開始對堆中對象進行可達性分析,找出存活的對象,這階RegionGC停頓G1CMSCMS的“標記——清理”算法,G1會使用壓縮算法,保證不產生多余的碎片。收集階段,G1會將某個區(qū)域存活的對象拷貝的其他區(qū)域,然后將整個區(qū)域整個回收。間范圍內,G1會選擇適當?shù)膮^(qū)域進行收集,確保停頓時間不超過用戶指定時間。-XX:+UnlockExperimentalVMOptionsXX:+UseG1GCG1-XX:+UseConcMarkSweepGC使用CMS-XX:ParallelGCThreads=n:CPU數(shù)。.5.JVM - - - - - -- -此值可以設置與-Xmx相同,以避免每次JVM整個堆大小=++64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun推薦配置為整個3/8。JDK5.01M,在相同物理內存下,減小這個值能生成的線程。但是操作系統(tǒng)對一個進程內的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~500041:41/54SurvivorEden2:4Survivor 最 0Survivor行多次,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。--- --.6.jvm內存相當于可視化的jstat命令,用于監(jiān)視收集器管理的虛擬機內存(java堆和永我們通過下面的一段代碼體驗一下它的監(jiān)視功能。運行時設置的虛擬機參數(shù)為:publicclassTestMemory{staticclassOOMObject{public ceholderpublicclassTestMemory{staticclassOOMObject{public ceholder=newbyte[64*}publicstaticvoidfillHeap(intnum)throwsExceptionArrayList<OOMObject>list=newArrayList<OOMObject>();for(inti=0;i<num;i++){}}publicstaticvoidmain(String[]args)throwsException{}}區(qū)都基本上被清空了,但是老年代仍然保持峰值狀態(tài),這說明,填充的數(shù)據(jù)在GC后仍然存listSystem.gc();fillHeap(1000);后,就可以全部回packageimportjava.io.IOException;importpackageimportjava.io.IOException;import***@paramThreadthread=newThread(newRunnable(){publicvoidrun()while(true);}},"testBusyThread");}*publicstaticvoidcrea ockThread(finalObjectlock){Threadthread=newThread(newRunnable(){publicvoidrun() synchronized(lock){try}catch(InterruptedExceptione){}}}},"testLockThread");}publicstaticvoidmain(String[]args)throwsExceptionBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));Objectobject=newObject(); }}}maintestBusyThread18while(true),直到線程切換,很耗性能testLockThreadwaittingnotifypackagepackagepublicclassTestDeadThreadimplementsRunnable{inta,b;publicTestDeadThread(inta,intb){this.a=a;this.b=}publicvoidrun()synchronized(Integer.valueOf(a)){System.out.println(a+b);}}}publicstaticvoidmain(String[]args){for(inti=0;i<100;i++){}}}thread-5的鎖被thread-10.7.java動態(tài)、反packagepackageimportimportimportjava.util.ArrayList;importimportimportpublicclassMyReflectpublicStringclassName=null;public Class=*類*@throwspublicvoidinit()throwsExceptionclassName= Class=}*獲取某個classpublicvoidgetClassName()throwsException{ }*獲取某個class文件對象的 publicvoidgetClassName2()throwsException{ }*創(chuàng)建一個classpublicvoidgetNewInstance()throwsException }@SuppressWarnings({"rawtypes","unchecked"}) =( }@SuppressWarnings({"rawtypes","unchecked"})Constructorcon= 消Java的權限檢測2=( }@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetNotPrivateField()throwsException Objectobj=constructor.newInstance(100L,"zhangsan");}

Fieldfield= field.set(obj,"lisi");@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetPrivateField()throwsException Objectobj=constructor.newInstance(100L);}

Fieldfield2 @SuppressWarnings({"unchecked"}) }

Objectobj= Objectobject= Objectobj Methodmethod Objectvalue=method.invoke(obj);}*publicvoidotherMethod()throwsException Class[]interfaces= for(Classclass1:interfaces){} *getResourceAsStreamname //ClassPath根下獲取,path不能以’/'ClassLoader獲 }}}service中實現(xiàn)的業(yè)務可能不能夠滿足當先客戶的要求,需要我們重新修改serviceservice的方法不只在我們這個模塊使用,在其他模塊也在調用,其service方法已經(jīng)能夠滿足業(yè)務需求,所以我們不能只為了我們service,導致其他模塊授影響??梢酝ㄟ^動態(tài)的方式,擴展我們的service中的方法實現(xiàn),使得在原油的方法中增加的業(yè)務,而不是實際修改service中的方法,這種實現(xiàn)技術就叫做動態(tài)。動 ,,買家調用action衣服,衣服在數(shù)據(jù)

溫馨提示

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

評論

0/150

提交評論