1. 更智能的隊(duì)列
通常我們?cè)趯?xiě)隊(duì)列的時(shí)候,考慮到多線程問(wèn)題控妻,一種比較好的寫(xiě)法如下:
public class ThreadSafeQueue {
private LinkedList<String> mList = new LinkedList<>();
private final Object mLock = new Object();
public void offer(String value) {
synchronized (mLock) {
mList.offer(value);
mLock.notifyAll();
}
}
public synchronized String poll() {
synchronized (mLock) {
while (mList.isEmpty()) {
try {
mLock.wait();
} catch (Exception e) {
}
}
return mList.poll();
}
}
}
雖然這段代碼是正確的州袒,但實(shí)現(xiàn)和測(cè)試這段代碼其實(shí)是在浪費(fèi)時(shí)間。實(shí)際上弓候,以上代碼用下面一句話代替足亦郎哭。
private LinkedBlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>();
2.更智能的鎖
Java提供的synchronized關(guān)鍵字允許開(kāi)發(fā)者創(chuàng)建線程安全的方法和代碼塊,synchronized關(guān)鍵字易于使用菇存,也很容易造成濫用的現(xiàn)象夸研,對(duì)性能造成負(fù)面影響,舉個(gè)列子依鸥,我們需要對(duì)數(shù)據(jù)區(qū)分讀寫(xiě)時(shí)亥至,synchronized關(guān)鍵字并不是最有效的,這種情況很常見(jiàn)贱迟,在長(zhǎng)時(shí)間的Android開(kāi)發(fā)時(shí)姐扮,通常對(duì)數(shù)據(jù)庫(kù)的操作,我見(jiàn)過(guò)很多是采用synchronized關(guān)鍵字衣吠,也遇到了很多不必要的麻煩茶敏,幸好,在java.util.concurrent.locks包中的工具類對(duì)這種情況做了很好的支持缚俏,如以下代碼
public class ReadWriteLockDemo {
private final ReentrantReadWriteLock mLock;
private String mName;
private int mAge;
private String mAddress;
public ReadWriteLockDemo(){
mLock = new ReentrantReadWriteLock();
}
public void setPersonData(String name,int age,String address){
ReentrantReadWriteLock.WriteLock writeLock = mLock.writeLock();
try {
writeLock.lock();
mName = name;
mAge = age;
mAddress = address;
} finally{
writeLock.unlock();
}
}
public String getName(){
ReentrantReadWriteLock.ReadLock readLock = mLock.readLock();
try {
readLock.lock();
return mName;
} finally {
readLock.unlock();
}
}
}
使用ReentrantReadWriteLock惊搏,允許多個(gè)并發(fā)的線程進(jìn)行只讀訪問(wèn)贮乳,并確保同一時(shí)間只有一個(gè)線程寫(xiě)入相同的數(shù)據(jù),顯然恬惯,ReentrantReadWriteLock比起synchronized關(guān)鍵字更有效率向拆,也更容易實(shí)現(xiàn)