队列、同步与锁

队列、同步与锁

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值