㈠ java Swing開發中的線程安全
SwingAPI的設計目標是強大 靈活和易用 非凡地 我們希望能讓程序員們方便地建立新的Swing組件 不論是從頭開始還是通過擴展我們所提供的一些組件 出於這個目的 我們不要求Swing組件支持多線程訪問 相反 我們向組件發送請求並在單一慎李線程中執行請求 本文討論線程和Swing組件 目的不僅是為了幫助你以線程安全的方式使用SwingAPI 而且解釋了我們為什麼會選擇現在這樣的線程方案 本文包括以下內容
單線程規則 Swing線程在同一時刻僅能被一個線程所訪問 一般來說 這個線程是事件派發線程 規則的例外 有些操作保證是線程安全的 事件分發 假如你需要從事件處理或繪制代碼以外的地方訪問UI 那麼你可以使用SwingUtilities類的invokeLater要求在事件派發線程中執行某些代碼 這個方法會立即返回 不會等待代碼執行完畢 invokeAndWait行為與invokeLater類似 除了這個方法會等待代碼執行完畢 一般地 你可以用invokeLater來代替這個方法 下面是一些使用這幾個API的例子 請同時參閱《TheJavaTutorial》中的 BINGOexample 尤其是以下幾個類 CardWindow ControlPane Player和OverallStatusPane
使用invokeLater方法你可以從任何線程調用invokeLater方法以請求事件派發線程運行特定代碼 你必須把要運行的代碼放到一個Runnable對象的run方法中 並將此Runnable對象設為invokeLater的參數 invokeLater方法會立即返回 不等待事件派發線程執行指定代碼 這是一個使用invokeLater方法的例子
RunnabledoWorkRunnable=newRunnable };
SwingUtilities invokeLater;使用invokeAndWait方法invokeAndWait方法和invokeLater方法很相似 除了invokeAndWait方法會等事件派發線程執行了指定代碼才返回 在可能的情況下 你應該盡量用invokeLater來代替invokeAndWait 假如你真的要使用invokeAndWait 請確保調用invokeAndWait的線程不會在調用期間持有任何其他線程可能需要的鎖
這是一個使用invokeAndWait的例子
}; 褲滑SwingUtilities invokeAndWait; }
類似地 假設一個線程需要對GUI的狀態進行存取 比如文本域的內容 它的代碼可能類似這樣
voidprintTextField throwsException }; SwingUtilities invokeAndWait; System out println;}
假如你能避免使用線程 最好這樣做 線程可能難於使用 並使得程序的debug更困難 一般來說 對於嚴格意義下的GUI工作 線程是不必要的 比如對組件屬性的更新 不管怎麼說 有時候線程是必要的 下列情況是使用線程的一些典型情況 執行一項費時的任務而不必將事件派發線程鎖定 例子包括執行大量計算的情況 會導致大量類被裝載的情況 和為網路或磁碟I/O而阻塞的情況 重復地執行一項操作 通常在兩次操作間間隔一個預定的時間周期 要等待來自客戶的消息 你可以使用兩個類來幫助你實現線程 SwingWorker 創建一個後台線程來執行費時的操作 Timer 創建一個線程來執行或多次執行某些代碼 在兩次執行間間隔用戶定義的延遲 使用SwingWorker類SwingWorker類在SwingWorker java中實現 這個類並不包寬純遲含在Java的任何發行版中 所以你必須單獨下載它 SwingWorker類做了所有實現一個後台線程所需的骯臟工作 雖然許多程序都不需要後台線程 後台線程在執行費時的操作時仍然是很有用的 它能提高程序的性能觀感
要使用SwingWorker類 你首先要實現它的一個子類 在子類中 你必須實現construct方法還包含你的長時間操作 當你實例化SwingWorker的子類時 SwingWorker創建一個線程但並不啟動它 你要調用你的SwingWorker對象的start方法來啟動線程 然後start方法會調用你的construct方法 當你需要construct方法返回的對象時 可以調用SwingWorker類的get方法 這是一個使用SwingWorker類的例子
//在main方法中 finalSwingWorkerworker=newSwingWorker }; worker start; //在動作事件處理方法中 JOptionPane showMessageDialog)
當程序的main方法調用start方法 SwingWorker啟動一個新的線程來實例化ExpensiveDialogComponent main方法還構造了由一個窗口和一個按鈕組成的GUI 當用戶點擊按鈕 程序將阻塞 假如必要 阻塞到ExpensiveDialogComponent創建完成 然後程序顯示一個包含ExpensiveDialogComponent的模式對話框 你可以在MyApplication java找到整個程序 使用Timer類Timer類通過一個ActionListener來執行或多次執行一項操作 你創建定時器的時候可以指定操作執行的頻率 並且你可以指定定時器的動作事件的監聽者 啟動定時器後 動作監聽者的actionPerformed方法會被調用來執行操作 定時器動作監聽者定義的actionPerformed方法將在事件派發線程中調用 這意味著你不必在其中使用invokeLater方法 這是一個使用Timer類來實現動畫循環的例子
publicvoidstartAnimationelse } publicvoidstopAnimation publicvoidactionPerformed }
在一個線程中執行所有的用戶界面代碼有這樣一些優點 組件開發者不必對線程編程有深入的理解 像ViewPoint和Trestle這類工具包中的所有組件都必須完全支持多線程訪問 使得擴展非常困難 尤其對不精通線程編程的開發者來說 最近的一些工具包如SubArctic和IFC 都採用和Swing類似的設計 事件以可預知的次序派發 invokeLater排隊的runnable對象從滑鼠和鍵盤事件 定時器事件 繪制請求的同一個隊列派發 在一些組件完全支持多線程訪問的工具包中 組件的改變被變化無常的線程調度程序穿插到事件處理過程中 這使得全面測試變得困難甚至不可能 更低的代價 嘗試小心鎖住臨界區的工具包要花費實足的時間和空間在鎖的治理上 每當工具包中調用某個可能在客戶代碼中實現的方法時 工具包都要保存它的狀態並釋放所有鎖 以便客戶代碼能在必要時獲得鎖 當控制權交回到工具包 工具包又必須重新抓住它的鎖並恢復狀態 所有應用程序都不得不負擔這一代價 即使大多數應用程序並不需要對GUI的並發訪問 這是的SubArcticJavaToolkit的對在工具包中支持多線程訪問的問題的描述 我們的基本信條是 當設計和建造多線程應用程序 尤其是那些包括GUI組件的應用程序時 必須保證極端小心 線程的使用可能會很有欺騙性 在許多情況下 它們表現得能夠極好的簡化編成 使得設計 專注於單一任務的簡單自治實體 成為可能 在一些情況下它們的確簡化了設計和編碼 然而 在幾乎所有的情況下 它們都使得調試 測試和維護的困難大大增加甚至成為不可能 無論大多數程序員所受的練習 他們的經驗和實踐 還是我們用來幫助自己的工具 都不是能夠用來對付非決定論的 例如 全面測試在bug依靠於時間時是幾乎不可能的 尤其對於Java來說 一個程序要運行在許多不同類型的機器的操作系統平台上 並且每個程序都必須在搶先和非搶先式調度下都能正常工作 由於這些固有的困難 我們力勸你三思是否絕對有使用線程的必要 盡管如此 有些情況下使用線程是必要的 所以subArctic提供了一個線程安全的訪問機制
lishixin/Article/program/Java/gj/201311/27616
㈡ 為什麼java的安全性比較高
1、語言層次的安全性主要體現在:
Java取消了強大但又危險的指針,而代之以引用。由於指針可進行移動運算,指針可隨便指向一個內存區域,而不管這個區域是否可用,這樣做是危險的,因為原來這個內存地址可能存儲著重要數據或者是其他程序運行所佔用的,並且使用指針也容易數組越界。
垃圾回收機制:不需要程序員直接控制內存回收,由垃圾回收器在後台自動回收不再使用的內存。避免程序忘記及時回收,導致內存泄露。避免程序錯誤回收程序核心類庫的內存,導致系統崩潰。
異常處理機制:Java異常機制主要依賴於try、catch、finally、throw、throws五個關鍵字。
強制類型轉換:只有在滿足強制轉換規則的情況下才能強轉成功。
底層的安全性可以從以下方面來說明
Java在位元組碼的傳輸過程中使用了公開密鑰加密機制(PKC)。
2、在運行環境提供了四級安全性保障機制:
位元組碼校驗器 -類裝載器 -運行時內存布局 -文件訪問限制
㈢ java 安全機制是什麼
1.Java語言本身嵌入了安全特性,其中包括編譯器/JVM對強數據類型的支持,自動的內存管理,位元組代碼的驗證機制以及獨特的安全類載入方式
2.密碼體系
3.jaas
4.安全通信
5.pki體系
沙箱.jvm
㈣ Java的安全機制有哪些
》類裝載器結構 (class loader)
》class文件檢查器 (the class file verifier)
》內置於Java虛擬機(及語言)的安全特性
》安全管理器及Java API (security manager)
在Java沙箱中,類裝載器體系結構是第一道防線。它在三個方面對Java的沙箱起作用:
1>它防止惡意代碼區干涉善意的代碼
2>它守護了被信任的代碼的邊界
3>它將代碼歸於某類(稱為保護域),該類確定了代碼可以進行哪種操作
Class文件檢查器:
Class文件檢查器保證裝載的class文件內容有正確的內部結構,並且這些class文件互相間協調一致。Class文件檢查器實現的安全目標之一就是程序的健壯性。如果某個有漏洞的編譯器,或某個聰明的黑客,產生了一個class文件,而這個class文件中包含了一個方法,則合格方法的位元組碼中含有一條跳轉到方法之外的指令,那麼,一旦這個方法被調用,它將導致虛擬機的崩潰,所以,處於對健壯性的考慮,由虛擬機檢驗它裝載的位元組碼的完整性非常重要。
Class文件檢查器要進行四趟獨立的掃描來完成它的操作。
第一趟:Class文件的結構檢查
在這一趟掃描中,對每一段將被當做類型導入的位元組序列,Class文件檢查器都會確認它是否符合JavaClass文件的節本結構。在這一趟檢查中檢查器會進行很多檢查例如:每個Class文件都必須以四個同樣的位元組開始:0xCAFEBABE。因為這個魔數Class文件分析器會很容易判斷出某個文件具有明顯問題而加以拒絕。檢查器還必須確認在Class文件中聲明的版本號和次版本號,這個版本號必須在這個虛擬機實現可以支持的范圍之內。而且第一趟掃描還必須確認這個Class文件有沒有被刪減。總之第一趟掃描的目的就是保證這個位元組序列正確的定義了一個新類型。
第二趟:類型數據的語義檢查
第二趟掃描,檢查器要查看每個組成部分,確認它們是否是其所屬類型的實例,他們的結構是否正確。另外還要檢查這個類本身是否符合特定的條件,它們是由Java編程語言規定的。例如,檢查器強制規定除Object類以外的類必須有一個超類,或者檢查final類有沒有被子化等。
第三趟:位元組碼驗證
這一趟是要確保採用任何路徑在位元組碼流中都得到一個確定的操作碼,確保操作數棧總是包含正確的數值以及正確的類型。
第四趟:符號引用的驗證
在動態鏈接的過程中,如果包含在一個Class文件中的符號引用被解析時,Class文件檢查器要進行第四趟檢查。第四趟掃描僅僅是動態鏈接過程的一部分。當一個Class文件被裝載時,它包含了對其他類的符號引用以及它們的欄位和方法。一個符號引用是一個字元串,它給出了名字,並且可能還包含了其他關於這個被引用項的信息------這些信息必須足以唯一的識別一個類、方法、欄位。這樣對於其他類的符號引用必須給出這個類的全名;對於其他類的欄位的符號引用必須給出類名、欄位名以及欄位描述符;對於其他類中的方法的引用必須給出類名、方法名以及方法的描述符。
所謂的動態鏈接是一個將符號引用解析為直接引用的過程。
此外,由於Java程序是動態鏈接的,所以Class文件檢查器在進行第四次掃描中,必須檢查相互引用類之間的兼容性。
除此之外,Java虛擬機還有一些內置的安全特性:
》類型安全的引用轉換
》結構化的內存訪問
》自動垃圾收集(不必顯式地釋放被分配的內存)
》空引用檢查
通過保證一個Java程序只能使用類型安全的、結構化的方法去訪問內存,Java虛擬機使得Java程序更為健壯。
㈤ 為了保證軟體的安全性,Java採用了那些措施
Java的安全性主要體現在以下幾個方面:
使用引用取代了指針,指針的功能強大,但是也容易造成錯誤,如數組越界問題。
擁有一套異常處理機制,使用關鍵字throw、throws、try、catch、finally
強制類型轉換需要符合一定規則
位元組碼傳輸使用了加密機制
運行環境提供保障機制:位元組碼校驗器->類載入器->運行時內存布局->文件訪問限制
不用程序員顯示控制內存釋放,JVM 有垃圾回收機制
㈥ 什麼是JAAS以及靈活的Java安全機制
JAAS:是通過驗證誰 Java Authentication Authorization Service(JAAS,Java驗證和授權API)提供靈活和可伸縮的機制來保證客戶端或伺服器端的Java程序。JAAS強調的是通過驗證誰在運行代碼以及他/她的許可權來保護系統面受用戶的攻擊。
Java的安全模式包括3層:Java語言本身,java編譯器和run-time系統,SecurityManager類。
在語言層,java以不同的方式來實現它的安全性,什麼原始類型的大小,對象的指針和偽訪問將不再唄允許,數組辯解檢查等待。
在java編譯器和run-time系統安全層提供了必要的功能,以確保java系統不會因無效代碼而崩潰,它提供了一個簡單的由一下三個子層所組成的安全的運行環境:
1:java位元組代碼解釋器和類格式檢驗
2:一個在運行時動態裝載和檢查庫的機制
3:自動的垃圾回收機制、