標籤:this 安全執行緒 == cells equals hash als 直接 如何
難道我們只能單純的背java的那個類是安全執行緒的,那個類不是安全執行緒的嗎?
這和授人以魚有何區別呢?難道就沒有一種方法授人以漁?直接教我們如何去判斷一個類是否是安全執行緒的?
java中的安全執行緒是什麼:
就是線程同步的意思,就是當一個程式對一個安全執行緒的方法或者語句進行訪問的時候,其他的不能再對他進行操作了,必須等到這次訪問結束以後才能對這個安全執行緒的方法進行訪問
什麼叫安全執行緒:
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程啟動並執行結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是安全執行緒的。
或者說:一個類或者程式所提供的介面對於線程來說是原子操作或者多個線程之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。
安全執行緒問題都是由全域變數及靜態變數引起的。
若每個線程中對全域變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域變數是安全執行緒的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響安全執行緒。
看過vector源碼的同學就會知道他的許多操作都是加了synchronized修飾的比如他的添加元素。(不知道synchronized是什麼意思的自行百度!)
| 123 |
public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj;} |
而HashMap的所有操作都沒有加synchronized修飾 ,不如他的put源碼
| 12345678910111213141516171819 |
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方法的源碼
| 12345 |
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } |
再看StringBuffer的append源碼,他是有synchronized修飾的
| 12345 |
public synchronized StringBuffer append(String str) { super.append(str); return this; } |
最後是Properties的setProperty方法,他是有synchronized修飾的
| 12345 |
public synchronized Object setProperty(String key, String value) { return put(key, value); } |
由此就可以判斷出誰是安全執行緒的了。
java中的安全執行緒