队列、同步与锁

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关键字更有效率,也更容易实现

    原文作者:looper1211
    原文地址: https://www.jianshu.com/p/0cc51caa1e35
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞