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);
}
|
由此就能够判断出谁是线程安全的了。线程