java中的線程安全是什麼:
就是線程同步的意思,就是當一個程序對一個線程安全的方法或者語句進行訪問的時候,其餘的不能再對他進行操做了,必須等到此次訪問結束之後才能對這個線程安全的方法進行訪問
什麼叫線程安全:
若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。
或者說:一個類或者程序所提供的接口對於線程來講是原子操做或者多個線程之間的切換不會致使該接口的執行結果存在二義性,也就是說咱們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態變量引發的。
若每一個線程中對全局變量、靜態變量只有讀操做,而無寫操做,通常來講,這個全局變量是線程安全的;如有多個線程同時執行寫操做,通常都須要考慮線程同步,不然就可能影響線程安全。
看過vector源碼的同窗就會知道他的許多操做都是加了synchronized修飾的好比他的添加元素。(不知道synchronized是什麼意思的自行百度!)java
1
2
3
|
public
synchronized
void
addElement(E obj) { modCount++;
ensureCapacityHelper(elementCount +
1
); elementData[elementCount++] = obj;
}
|
而HashMap的全部操做都沒有加synchronized修飾 ,不如他的put源碼安全
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
V put(K key, V value) {
if
(key ==
null
)
return
putForNullKey(value);
int
hash = hash(key.hashCode());
int
i = indexFor(hash, table.length);
for
(Entry<K,V> e = table[i]; e !=
null
; e = e.next) {
Object k;
if
(e.hash == hash &&((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(
this
);
return
oldValue; }
}
modCount++;
addEntry(hash, key, value, i);
return
null
;
}
|
再看看ArrayList的add方法的源碼app
1
2
3
4
5
|
public
boolean
add(E e) {
ensureCapacity(size +
1
);
// Increments modCount!!
elementData[size++] = e;
return
true
;
}
|
再看StringBuffer的append源碼,他是有synchronized修飾的this
1
2
3
4
5
|
public
synchronized
StringBuffer append(String str) {
super
.append(str);
return
this
;
}
|
最後是Properties的setProperty方法,他是有synchronized修飾的spa
1
2
3
4
5
|
public
synchronized
Object setProperty(String key, String value) {
return
put(key, value);
}
|
由此就能夠判斷出誰是線程安全的了。線程