天天看點

java代碼中提現相關_java中線程安全提現在兩個方面

java中線程安全提現在兩個方面

在Java裡,線程安全一般展現在兩個方面:

(1)多個thread對同一個java執行個體的通路(read和modify)不會互相幹擾,它主要展現在關鍵字synchronized.如ArrayList和Vector,HashMap和Hashtable(後者每個方法前都有synchronized關鍵字)。如果你在Iterator周遊一個List對象時,同時其它線程remove一個element時,就會出現問題,資料丢失。(ArrayList是非線程安全的,而Vector是線程安全的;HashMap是非線程安全的,而Hashtable是線程安全的。)

(2)每個線程都有自己的私有字段或變量,這樣可以不會在多個線程之間共享。它主要展現在java.lang.ThreadLocal類,而沒有Java關鍵字支援,如像static、transient那樣。(一個對象隻要實作了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,隻要這個類實作了Serilizable接口,這個對象的所有屬性和方法都會自動序列化。 然而在實際開發過程中,某些類的有些屬性需要序列化,而其他屬性不需要被序列化時,則可以借助java的transient關鍵字。在需要序列化對象的時候,實作Serilizable接口,将類中不需要序列化的屬性前添加關鍵字transient,那麼帶transient關鍵字的屬性就不會序列化到指定的目的地中。)

java線程安全了解:

如果你的代碼所在的程序中有多個線程同時運作,而這些線程可能會同時運作同一段代碼。如果每次運作結果和單線程運作的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。

比如一個ArrayList類,在添加一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2.增大Size的值。

在單線程運作的情況下,如果Size =0,添加一個元素後,此元素在位置0,而且 Size=1;

如果是在多線程情況下,比如有兩個線程,線程 A 先将元素存放在位置0。但是此時 CPU 排程線程A暫停,線程 B 得到運作的機會。線程B也向此 ArrayList 添加元素,因為此時 Size 仍然等于 0 (注意哦,我們假設的是添加一個元素是要兩個步驟哦,而線程A僅僅完成了步驟1),是以線程B也将元素存放在位置0。然後線程A和線程B都繼續運作,都增加 Size 的值。

那好,現在我們來看看 ArrayList 的情況,元素實際上隻有一個,存放在位置 0,而 Size 卻等于 2。這就是“線程不安全”了。

如何做到線程安全:—-四種方式 sychronized關鍵字

1. sychronized method(){}

2. sychronized (objectReference) {/block/}

3. static synchronized method(){}

4. sychronized(classname.class)

其中1和2是代表鎖目前對象,即一個對象就一個鎖,3和4代表鎖這個類,即這個類的鎖。要注意的是sychronized method()不是鎖這個函數,而是鎖對象,即:如果這個類中有兩個方法都是sychronized,那麼隻要有兩個線程共享一個該類的reference(引用),每個調用這兩個方法之一,不管是否同一個方法,都會用這個對象鎖進行同步。