本文目錄一覽:
- 1、應用程序被java安全阻止怎麼辦
- 2、為了保證軟體的安全性,Java採用了那些措施?
- 3、為什麼java的安全性比較高
- 4、JAVA的安全性究竟怎樣體現出來
- 5、Java的List如何實現線程安全?
- 6、Java的安全機制有哪些?
應用程序被java安全阻止怎麼辦
應用程序被java安全阻止了解決辦法:
Internet選項–高級 ,找到”允許活動內容在我的計算機上的文件中運行” 打上勾;
Internet選項–程序–管理載入項 ,找到「Java(tm)Plug……」啟用
如果不想出現「為了有利於保護安全性,Internet 已限制網頁運行可以訪問計算機的腳本……」,需要在安全選項–自定義級別–Activex控制項和插件,勾選啟用。
為了保證軟體的安全性,Java採用了那些措施?
Java的安全性主要體現在以下幾個方面:
使用引用取代了指針,指針的功能強大,但是也容易造成錯誤,如數組越界問題。
擁有一套異常處理機制,使用關鍵字 throw、throws、try、catch、finally
強制類型轉換需要符合一定規則
位元組碼傳輸使用了加密機制
運行環境提供保障機制:位元組碼校驗器-類載入器-運行時內存布局-文件訪問限制
不用程序員顯示控制內存釋放,JVM 有垃圾回收機制
為什麼java的安全性比較高
java的安全性體現在兩個方面:
1、語言層次的安全性主要體現在:
Java取消了強大但又危險的指針,而代之以引用。由於指針可進行移動運算,指針可隨便指向一個內存區域,而不管這個區域是否可用,這樣做是危險的,因為原來這個內存地址可能存儲著重要數據或者是其他程序運行所佔用的,並且使用指針也容易數組越界。
垃圾回收機制:不需要程序員直接控制內存回收,由垃圾回收器在後台自動回收不再使用的內存。避免程序忘記及時回收,導致內存泄露。避免程序錯誤回收程序核心類庫的內存,導致系統崩潰。
異常處理機制:Java異常機制主要依賴於try、catch、finally、throw、throws五個關鍵字。
強制類型轉換:只有在滿足強制轉換規則的情況下才能強轉成功。
底層的安全性可以從以下方面來說明
Java在位元組碼的傳輸過程中使用了公開密鑰加密機制(PKC)。
2、在運行環境提供了四級安全性保障機制:
位元組碼校驗器 -類裝載器 -運行時內存布局 -文件訪問限制
JAVA的安全性究竟怎樣體現出來
java的安全性主要體現在:下載到本地的java applet只限制在java運行環境中,而不允許它訪問計算機的其他部分。
這是由於java編譯器輸出的並不是可執行代碼,而是位元組代碼(bytecode),java的運行系統就是java虛擬機,每個java程序的運行都是在java虛擬機的控制之下。java虛擬機可以包含這個程序並且阻止它在系統外產生副作用。通過java語言中的適當限制增強了安全性。
Java的List如何實現線程安全?
Java的List如何實現線程安全?
Collections.synchronizedList(names);效率最高,線程安全
Java的List是我們平時很常用的集合,線程安全對於高並發的場景也十分的重要,那麼List如何才能實現線程安全呢 ?
加鎖
首先大家會想到用Vector,這裡我們就不討論了,首先討論的是加鎖,例如下面的代碼
public class Synchronized{
private ListString names = new LinkedList();
public synchronized void addName(String name ){
names.add(“abc”);
}
public String getName(Integer index){
Lock lock =new ReentrantLock();
lock.lock();
try {
return names.get(index);
}catch (Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
}
return null;
}
}
synchronized一加,或者使用lock 可以實現線程安全,但是這樣的List要是很多個,代碼量會大大增加。
java自帶類
在java中我找到自帶有兩種方法
CopyOnWriteArrayList
CopyOnWrite 寫入時複製,它使一個List同步的替代品,通常情況下提供了更好的並發性,並且避免了再迭代時候對容器的加鎖和複製。通常更適合用於迭代,在多插入的情況下由於多次的複製性能會一定的下降。
下面是add方法的源代碼
public boolean add(E e) {
final ReentrantLock lock = this.lock; // 加鎖 只允許獲得鎖的線程訪問
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
// 創建個長度加1的數組並複製過去
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e; // 賦值
setArray(newElements); // 設置內部的數組
return true;
} finally {
lock.unlock();
}
}
Collections.synchronizedList
Collections中有許多這個系列的方法例如
主要是利用了裝飾者模式對傳入的集合進行調用 Collotions中有內部類SynchronizedList
static class SynchronizedListE
extends SynchronizedCollectionE
implements ListE {
private static final long serialVersionUID = -7754090372962971524L;
final ListE list;
SynchronizedList(ListE list) {
super(list);
this.list = list;
}
public E get(int index) {
synchronized (mutex) {return list.get(index);}
}
public E set(int index, E element) {
synchronized (mutex) {return list.set(index, element);}
}
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
public E remove(int index) {
synchronized (mutex) {return list.remove(index);}
}
static class SynchronizedCollectionE implements CollectionE, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final CollectionE c; // Backing Collection
final Object mutex; // Object on which to synchronize
這裡上面的mutex就是鎖的對象 在構建時候可以指定鎖的對象 主要使用synchronize關鍵字實現線程安全
/**
* @serial include
*/
static class SynchronizedListE
extends SynchronizedCollectionE
implements ListE {
private static final long serialVersionUID = -7754090372962971524L;
final ListE list;
SynchronizedList(ListE list) {
super(list);
this.list = list;
}
SynchronizedList(ListE list, Object mutex) {
super(list, mutex);
this.list = list;
}
這裡只是列舉SynchronizedList ,其他類類似,可以看下源碼了解下。
測試
public class Main {
public static void main(String[] args) {
ListString names = new LinkedList();
names.add(“sub”);
names.add(“jobs”);
// 同步方法1 內部使用lock
long a = System.currentTimeMillis();
ListString strings = new CopyOnWriteArrayList(names);
for (int i = 0; i 100000; i++) {
strings.add(“param1”);
}
long b = System.currentTimeMillis();
// 同步方法2 裝飾器模式使用 synchronized
ListString synchronizedList = Collections.synchronizedList(names);
for (int i = 0; i 100000; i++) {
synchronizedList.add(“param2”);
}
long c = System.currentTimeMillis();
System.out.println(“CopyOnWriteArrayList time == “+(b-a));
System.out.println(“Collections.synchronizedList time == “+(c-b));
}
}
兩者內部使用的方法都不一樣,CopyOnWriteArrayList內部是使用lock進行加鎖解鎖完成單線程訪問,synchronizedList使用的是synchronize
進行了100000次添加後時間對比如下:
可以看出來還是使用了synchronize的集合工具類在添加方面更加快一些,其他方法這裡篇幅關係就不測試了,大家有興趣去試一下。
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程序更為健壯。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/295575.html