队列、同步与锁

来源:互联网 发布:python使用领域 编辑:程序博客网 时间:2024/04/29 14:43

队列、同步与锁

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

0 0
原创粉丝点击