java-6個(gè)機(jī)制_第1頁(yè)
java-6個(gè)機(jī)制_第2頁(yè)
java-6個(gè)機(jī)制_第3頁(yè)
java-6個(gè)機(jī)制_第4頁(yè)
java-6個(gè)機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

克隆機(jī)制克隆機(jī)制 克隆就是在內(nèi)存中復(fù)制對(duì)象 Java 克隆 Clone 是 Java 語(yǔ)言的特性之一 但在實(shí)際中應(yīng)用 比較少見 但有時(shí)候用克隆會(huì)更方便更有效率 缺點(diǎn)應(yīng)該是多分配了一塊空間 占內(nèi)存 吧 如果數(shù)據(jù)量大 內(nèi)存占用的就大 對(duì)于克隆對(duì)于克隆 Clone Clone JavaJava 有一些限制 有一些限制 1 1 被克隆的類必須自己實(shí)現(xiàn) 被克隆的類必須自己實(shí)現(xiàn) CloneableCloneable 接口 以指示接口 以指示 Object clone Object clone 方法可以合法地方法可以合法地 對(duì)該類實(shí)例進(jìn)行按字段復(fù)制 對(duì)該類實(shí)例進(jìn)行按字段復(fù)制 CloneableCloneable 接口實(shí)際上是個(gè)標(biāo)識(shí)接口 沒有任何接口方法 接口實(shí)際上是個(gè)標(biāo)識(shí)接口 沒有任何接口方法 2 2 實(shí)現(xiàn) 實(shí)現(xiàn) CloneableCloneable 接口的類應(yīng)該使用公共方法重寫接口的類應(yīng)該使用公共方法重寫 Object cloneObject clone 它是受保護(hù)的 某 它是受保護(hù)的 某 個(gè)對(duì)象實(shí)現(xiàn)了此接口就克隆它是不可能的 即使個(gè)對(duì)象實(shí)現(xiàn)了此接口就克隆它是不可能的 即使 cloneclone 方法是反射性調(diào)用的 也無法保證方法是反射性調(diào)用的 也無法保證 它將獲得成功 它將獲得成功 3 3 在 在 Java lang ObjectJava lang Object 類中克隆方法是這么定義的 類中克隆方法是這么定義的 protectedprotected ObjectObject clone throwsclone throws CloneNotSupportedException CloneNotSupportedException 創(chuàng)建并返回此對(duì)象的一個(gè)副本 表明是一個(gè)受保護(hù)的方法 同一個(gè)包中可見 創(chuàng)建并返回此對(duì)象的一個(gè)副本 表明是一個(gè)受保護(hù)的方法 同一個(gè)包中可見 按照慣例 返回的對(duì)象應(yīng)該通過調(diào)用按照慣例 返回的對(duì)象應(yīng)該通過調(diào)用 super clonesuper clone 獲得 獲得 克隆分為深克隆和淺克隆 淺度克隆 淺度克隆對(duì)于要克隆的對(duì)象 對(duì)于其基本數(shù)據(jù)類型的屬性 復(fù)制一份給新產(chǎn)生 的對(duì)象 對(duì)于非基本數(shù)據(jù)類型的屬性 僅僅復(fù)制一份引用給新產(chǎn)生的對(duì)象 即新產(chǎn)生的對(duì) 象和原始對(duì)象中的非基本數(shù)據(jù)類型的屬性都指向的是同一個(gè)對(duì)象 深度克隆 在淺度克隆的基礎(chǔ)上 對(duì)于要克隆的對(duì)象非基本數(shù)據(jù)類型的屬性對(duì)應(yīng)的類 也 實(shí)現(xiàn)克隆 這樣對(duì)于非基本數(shù)據(jù)類型的屬性 復(fù)制的不是同一份引用 即新產(chǎn)生的對(duì)象和 原始對(duì)象中的非基本數(shù)據(jù)類型的屬性指向的不是同一個(gè)對(duì)象 序列化機(jī)制序列化機(jī)制 序列化也叫串行化 試講對(duì)象轉(zhuǎn)換成緊湊的二進(jìn)制域的形式 使該對(duì)象具備可以被持久化 即永久保存的特性 序列化的必要性序列化的必要性 Java 中 一切都是對(duì)象 在分布式環(huán)境中經(jīng)常需要將 Object 從這一端網(wǎng)絡(luò)或設(shè) 備傳遞到另一端 這就需要有一種可以在兩端傳輸數(shù)據(jù)的協(xié)議 Java 序列化機(jī)制就是為了解決這 個(gè)問題而產(chǎn)生 如何序列化一個(gè)對(duì)象如何序列化一個(gè)對(duì)象 一個(gè)對(duì)象能夠序列化的前提是實(shí)現(xiàn) Serializable 接口 Serializable 接口沒有方法 更像是個(gè)標(biāo)記 有了這個(gè)標(biāo)記的 Class 就能被序列化機(jī)制處理 import java io Serializable class TestSerial implements Serializable public byte version 100 public byte count 0 然后我們寫個(gè)程序?qū)?duì)象序列化并輸出 ObjectOutputStream 能把 Object 輸出 成 Byte 流 我們將 Byte 流暫時(shí)存儲(chǔ)到 temp out 文件里 public static void main String args throws IOException FileOutputStream fos new FileOutputStream temp out ObjectOutputStream oos new ObjectOutputStream fos TestSerial ts new TestSerial oos writeObject ts oos flush oos close 如果要從持久的文件中讀取 Bytes 重建對(duì)象 我們可以使用 ObjectInputStream public static void main String args throws IOException FileInputStream fis new FileInputStream temp out ObjectInputStream oin new ObjectInputStream fis TestSerial ts TestSerial oin readObject System out println version ts version 多線程機(jī)制 反射機(jī)制反射機(jī)制 反射是 Class 類具備了解析其他類的對(duì)象的內(nèi)部結(jié)構(gòu)的功能或者說是本領(lǐng) Java 中至簡(jiǎn)的說只有兩個(gè)類 Object 和 Class 類 有了 Class 類 就可以由 Class 類解析生成了你想要的實(shí)體類 Class 以類的形式存在 Object 以對(duì)象的形式存在 所以說 Class 類是描述 Object 的 反射機(jī)制也叫做自省機(jī)制 自己了解自己 Class 類中有一系列的屬性及方法 這些東西 就可以實(shí)現(xiàn)反射 應(yīng)用反射 就可以知道這個(gè)類中哪些方法和屬性可以調(diào)用和使用 CLass 類中的方法有很多 知曉類的內(nèi)部結(jié)構(gòu) 就可以調(diào)用相應(yīng)的方法來獲取類中相應(yīng)的 屬性或方法數(shù)組并生成方法或者屬性類的集合 這些可以自行學(xué)習(xí) API 來理解 由 Class 類獲取到了一個(gè)類中的屬性和方法等結(jié)構(gòu)內(nèi)容 就可以知曉一個(gè)類的內(nèi)部結(jié)構(gòu)是 什么樣的 Class 類不僅可以描述對(duì)象 還可以生成對(duì)象 生成的對(duì)象經(jīng)過下塑造性就可以得到我們 想要的類 對(duì)反射進(jìn)行封裝的類為 java lang Class 類 多線程機(jī)制多線程機(jī)制 簡(jiǎn)介 多線程的目的是為了最大限度的利用 CPU 資源 Java 編寫程序都運(yùn)行在在 Java 虛擬機(jī) JVM 中 在 JVM 的內(nèi)部 程序的多任務(wù)是通過 線程來實(shí)現(xiàn)的 每用 java 命令啟動(dòng)一個(gè) java 應(yīng)用程序 就會(huì)啟動(dòng)一個(gè) JVM 進(jìn)程 在同一 個(gè) JVM 進(jìn)程中 有且只有一個(gè)進(jìn)程 就是它自己 在這個(gè) JVM 環(huán)境中 所有程序代碼的 運(yùn)行都是以線程來運(yùn)行 對(duì)于一個(gè)進(jìn)程中的多個(gè)線程來說 多個(gè)線程共享進(jìn)程的內(nèi)存塊 當(dāng)有新的線程產(chǎn)生的時(shí)候 操作系統(tǒng)不分配新的內(nèi)存 而是讓新線程共享原有的進(jìn)程塊的內(nèi)存 因此 線程間的通信 很容易 速度也很快 不同的進(jìn)程因?yàn)樘幱诓煌膬?nèi)存塊 因此進(jìn)程之間的通信相對(duì)困難 實(shí)際上 操作的系統(tǒng)的多進(jìn)程實(shí)現(xiàn)了多任務(wù)并發(fā)執(zhí)行 程序的多線程實(shí)現(xiàn)了進(jìn)程的并發(fā)執(zhí) 行 多任務(wù) 多進(jìn)程 多線程的前提都是要求操作系統(tǒng)提供多任務(wù) 多進(jìn)程 多線程的支 持 內(nèi)容復(fù)習(xí) 內(nèi)容復(fù)習(xí) 程序運(yùn)行的本身是以 進(jìn)程 為單位的 程序中的細(xì)小的分支即線程 線程離開進(jìn)程遍無意 義 進(jìn)程 是程序的一次動(dòng)態(tài)執(zhí)行過程 運(yùn)行在操作系統(tǒng)平臺(tái) 它對(duì)應(yīng)了從代碼加載 執(zhí)行 至執(zhí)行完畢的一個(gè)完整過程 main 方法中執(zhí)行 main 方法本身就是一個(gè)進(jìn)程 線程 是比進(jìn)程更小的執(zhí)行單位 一個(gè)進(jìn)程在其執(zhí)行的過程中 可以產(chǎn)生多個(gè)線程 他們 分別可以執(zhí)行不同的任務(wù) 進(jìn)程與進(jìn)程來講 是彼此獨(dú)立的 不共享空間 而線程之間需要互相聯(lián)系 所以空間是可 以相互共享的 進(jìn)程和線程的關(guān)系和區(qū)別 進(jìn)程和線程的關(guān)系和區(qū)別 進(jìn)程需要操作系統(tǒng)為其分配獨(dú)立的內(nèi)存地址空間 而同一個(gè)進(jìn)程中的線程在同一塊地址空 間中工作這些線程可以共享一塊內(nèi)存和系統(tǒng)資源 比如共享一個(gè)對(duì)象或者打開的一個(gè)文件 操作系統(tǒng)是以進(jìn)程為單位的 程序是以線程為單位的 多線程程序的用途 多線程程序的用途 1 充分利用 CPU 資源 避免資源的浪費(fèi) 提高處理數(shù)據(jù)的效率 2 與用戶的更往交互 如復(fù)制 ofice 簡(jiǎn)化開發(fā)模型 每個(gè)線程就是指一個(gè)單獨(dú)的任務(wù) 這樣有助于開發(fā)人員對(duì)程序的理解和 維護(hù) 3 模擬同步動(dòng)作 動(dòng)畫的效果 交替的執(zhí)行 幾個(gè)線程同步執(zhí)行 將任務(wù)分化成更細(xì)粒度的線程 交替執(zhí)行 模擬同步操作每個(gè)線程都會(huì)得到一小段程序 執(zhí)行的時(shí)間片 4 節(jié)約成本 提高速率的 3 中方法 a 增加處理器個(gè)數(shù) b 啟動(dòng)多個(gè)進(jìn)程 相互獨(dú)立 影響通信 c 多線程 多線程的聲明周期多線程的聲明周期 階段階段 1 1 創(chuàng)建階段 實(shí)例化線程創(chuàng)建階段 實(shí)例化線程 java lang Thread java lang Runnable 接口 線程的封裝類 Thread 1 設(shè)計(jì)線程類 class A extends Thread public void run 被重構(gòu)的 Run 方法 寫要執(zhí)行的業(yè)務(wù)邏輯代碼 代碼為 當(dāng)前線程搶占到資源之后所做的事情 2 設(shè)計(jì) Runnable 接口類 實(shí)現(xiàn)該接口 創(chuàng)建線程 class A implements Runnable public void run 被重構(gòu)的 Run 方法 寫要執(zhí)行的業(yè)務(wù)邏輯代碼 代碼為 當(dāng)前線程搶占到資源之后所做的事情 兩種方法的區(qū)別 單繼承就是用 thread 即可 實(shí)現(xiàn)多個(gè)父類時(shí) 用 Runnable 接口 線程對(duì)象實(shí)例化方法 實(shí)現(xiàn) Runnable 接口時(shí)的線程對(duì)象實(shí)例化方法 Thread t new Thread new A 繼承 Thread 類時(shí)的線程對(duì)象實(shí)例化方法 A a1 new A 2 可運(yùn)行狀態(tài) 1 就緒狀態(tài) 當(dāng)前創(chuàng)建的線程對(duì)象一定要放在隊(duì)列當(dāng)中 這個(gè)隊(duì)列叫 CPU 線程隊(duì)列 只 有放在該對(duì)列里 才有去搶占 CPU 資源的權(quán)利 放在該隊(duì)列里了 就表明該隊(duì)列處于就緒 狀態(tài) CPU 看見誰(shuí) 就會(huì)給誰(shuí)分配時(shí)間片 讓其運(yùn)行 然后在交替的去分配給別的線程時(shí)間片 就緒狀態(tài)調(diào)用的方法為 start 方法 2 運(yùn)行 運(yùn)行狀態(tài)回調(diào)的方法為 run 方法 3 阻塞狀態(tài) 主動(dòng)讓其休眠 被動(dòng)的讓其休眠 調(diào)用的方法 1 為 sleep int 時(shí)間 ms 休眠期 哪個(gè)線程調(diào)用該方法 哪個(gè)線程休息 休息時(shí)間有參數(shù)決定 休眠時(shí)并沒有退出隊(duì)列 休息之后 不需要要通知 CPU 可直接調(diào) 用 調(diào)用的方法 2 wait 等待 在線程隊(duì)列之外進(jìn)行等待 來解決阻塞的問題 詳解為 在阻塞時(shí) 會(huì)主動(dòng)退出隊(duì)列 而再次需要他時(shí) 程序要主動(dòng)召喚它才能再次使用 而喚醒處于等待的對(duì)象調(diào)用的方法有兩種 1void notify 如果當(dāng)前的程序可以解決阻塞狀態(tài) 則需要主動(dòng)的去喚醒處于隊(duì)列之 外的其他線程對(duì)象 喚醒一個(gè)線程的方法為 notify 2 喚醒所有線程的方法為 notifyAll 封裝這三種方法的類為 Object 類 wait notify notifyAll 系統(tǒng)直接支持線程阻塞機(jī)制 多線程同步機(jī)制 多線程帶來的問題 處理數(shù)據(jù)的方法有可能存在數(shù)據(jù)處理不安全 數(shù)據(jù)處理不同步的安全 隱患 那么處理該問題的方法為線程同步的處理方法 阻塞的第三種方法 在線程要處理的方 法前面加上修飾詞 synchronizedsynchronized 降低了執(zhí)行速率 同步之后是排隊(duì)進(jìn)行處理的 但是 降低了執(zhí)行速率 同步之后是排隊(duì)進(jìn)行處理的 但是 是隨機(jī)的排隊(duì) 一個(gè)一個(gè)的處理 避免了其他的線程搶占資源后出現(xiàn)錯(cuò)誤安全隱患 是隨機(jī)的排隊(duì) 一個(gè)一個(gè)的處理 避免了其他的線程搶占資源后出現(xiàn)錯(cuò)誤安全隱患 線程同步的優(yōu)缺點(diǎn) 線程同步的優(yōu)缺點(diǎn) 線程同步 線程同步 即在線程要處理的方法前面加上修飾詞 synchronizedsynchronized 可以確保數(shù)據(jù)在多線 可以確保數(shù)據(jù)在多線 程的環(huán)境下時(shí) 處理是準(zhǔn)確和安全的 程的環(huán)境下時(shí) 處理是準(zhǔn)確和安全的 線程同步的方法處理數(shù)據(jù)的速度慢 線程同步的方法處理數(shù)據(jù)的速度慢 線程同步總結(jié) 線程同步總結(jié) 程序處理數(shù)據(jù)時(shí)程序處理數(shù)據(jù)時(shí) 尤其是寫數(shù)據(jù) 我們首先應(yīng)該注意的是 數(shù)據(jù)處理的準(zhǔn)確性 一致性和安尤其是寫數(shù)據(jù) 我們首先應(yīng)該注意的是 數(shù)據(jù)處理的準(zhǔn)確性 一致性和安 全性 所以 為了確保以上三點(diǎn) 全性 所以 為了確保以上三點(diǎn) javajava 當(dāng)中是通過同步來解決上述問題的 而同步的方法 當(dāng)中是通過同步來解決上述問題的 而同步的方法 就意味著當(dāng)前線程在處理數(shù)據(jù)時(shí) 其他的線程對(duì)象要處于阻塞狀態(tài) 所以線程同步會(huì)導(dǎo)致就意味著當(dāng)前線程在處理數(shù)據(jù)時(shí) 其他的線程對(duì)象要處于阻塞狀態(tài) 所以線程同步會(huì)導(dǎo)致 數(shù)據(jù)的處理速度慢 可是線程同步卻能保證數(shù)據(jù)處理的安全性 數(shù)據(jù)的處理速度慢 可是線程同步卻能保證數(shù)據(jù)處理的安全性 使用同步的情況 使用同步的情況 多線程程序同時(shí)訪問一個(gè)方法時(shí) 該方法如果是更新 增刪改 數(shù)據(jù)的方法 就一定要加多線程程序同時(shí)訪問一個(gè)方法時(shí) 該方法如果是更新 增刪改 數(shù)據(jù)的方法 就一定要加 上同步的修飾詞上同步的修飾詞 synchronized synchronized 查詢數(shù)據(jù)的時(shí)候要考慮數(shù)據(jù)的速度 不需要考慮安全性 查詢數(shù)據(jù)的時(shí)候要考慮數(shù)據(jù)的速度 不需要考慮安全性 所以不需要同步 所以不需要同步 4 銷毀狀態(tài) Yeild 官方解釋終止線程 但實(shí)際應(yīng)用時(shí)不是 Alived 企鵝 U 定線程是否被銷毀 不能使線程終止 是線程死亡的方法是 在 run 方法中加條件 要銷毀的時(shí)候 return 來結(jié)束 run 方法 線程是分級(jí)別的 0 1 2 高中低 高級(jí)別的線程 CPU 看到他的幾率越高 線程習(xí)題 線程習(xí)題 進(jìn)程與線程的定義與區(qū)別 進(jìn)程 是程序的一次動(dòng)態(tài)執(zhí)行過程 他對(duì)應(yīng)了從代碼加載 執(zhí)行至執(zhí)行完畢的一個(gè)整個(gè)過 程 一般在控制類中住方法里執(zhí)行的 main 本身就是一個(gè)進(jìn)程 線程 是比進(jìn)程更小的執(zhí)行單位 一個(gè)進(jìn)程在其執(zhí)行過程中 可以產(chǎn)生多個(gè)線程 他們分 別可以執(zhí)行不同的任務(wù) 區(qū)別 進(jìn)程需要操作為其分配獨(dú)立的內(nèi)存地址空間 而同一個(gè)進(jìn)程中的線程在同一塊地址空間 中工作 這些線程可共享同一塊內(nèi)存和系統(tǒng)資源 比如共享一個(gè)對(duì)象或者共享打開的一個(gè)文件 6 多線程的用途 a 充分利用 CPU 的資源避免資源浪費(fèi) 什么時(shí)候使用多線程 即提高系統(tǒng)效率時(shí)使用 b 與用戶的更加交互 復(fù)制 Office 簡(jiǎn)化開發(fā)模型 每一個(gè)線程就是指一個(gè)單獨(dú)的任務(wù) 這樣有助于開發(fā)人員對(duì)程序的理 解和維護(hù) c 模擬同步動(dòng)作 模擬同步動(dòng)作 d 節(jié)約成本 提高效率的三種辦法 1 增加處理器的個(gè)數(shù) 多核 成本高 2 啟動(dòng)多個(gè)進(jìn)程 3 多線程 提高處理速度 沒有在硬件上增加成本 7 線程的生命周期 分別由程序?qū)崿F(xiàn) 例如 1 創(chuàng)建狀態(tài) 實(shí)例化線程對(duì)象 java lang Thread java long Runnable 接口 如何設(shè)計(jì)線程類 方法一 先繼承 Thread 之后重構(gòu) run 例 class A extends Thread Thread 中有一個(gè) 無返回值的 run public void run 重構(gòu) run 方法二 實(shí)現(xiàn) Runnable 之后重構(gòu) run 例 class A implements Runnable Runnable 中有一個(gè) 無返回值的 run public void run 重構(gòu) run 如何創(chuàng)建線程 方法一 Thread Thread t new Thread new A 方法二 Runnable A a1 new A 2 可運(yùn)行狀態(tài) 包括兩種狀態(tài) 即 就緒狀態(tài)和運(yùn)行狀態(tài) 就緒狀態(tài)調(diào)用的方法是 線程對(duì)象 start 運(yùn)行狀態(tài)執(zhí)行的是 重構(gòu) run 3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論