1. 更智能的队列
通常我们在写队列的时候,考虑到多线程问题,一种比较好的写法如下:
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();
}
}
}
虽然这段代码是正确的,但实现和测试这段代码其实是在浪费时间。实际上,以上代码用下面一句话代替足亦。
private LinkedBlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>();
2.更智能的锁
Java提供的synchronized关键字允许开发者创建线程安全的方法和代码块,synchronized关键字易于使用,也很容易造成滥用的现象,对性能造成负面影响,举个列子,我们需要对数据区分读写时,synchronized关键字并不是最有效的,这种情况很常见,在长时间的Android开发时,通常对数据库的操作,我见过很多是采用synchronized关键字,也遇到了很多不必要的麻烦,幸好,在java.util.concurrent.locks包中的工具类对这种情况做了很好的支持,如以下代码
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,允许多个并发的线程进行只读访问,并确保同一时间只有一个线程写入相同的数据,显然,ReentrantReadWriteLock比起synchronized关键字更有效率,也更容易实现