美文网首页Java进阶
队列、同步与锁

队列、同步与锁

作者: looper1211 | 来源:发表于2016-05-24 20:58 被阅读177次

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

相关文章

  • 并发编程05--Java中的锁(Lock接口和队列同步器)

    Java中的锁Lock接口队列同步器队列同步器的接口与示例队列同步器的实现分析同步队列独占式同步状态获取与释放共享...

  • 队列、同步与锁

    1. 更智能的队列 通常我们在写队列的时候,考虑到多线程问题,一种比较好的写法如下: 虽然这段代码是正确的,但实现...

  • 10.AQS抽象队列同步器

    同步锁的本质-排队 同步的方式:独享锁-单个队列窗口,共享锁-多个队列窗口 抢锁的方式:插队锁(不公平锁)、先来后...

  • AbstractQueuedSynchronizer 队列同步器

    AbstractQueuedSynchronizer 队列同步器(AQS) 队列同步器 (AQS), 是用来构建锁...

  • Java并发编程-队列同步器(AbstractQueuedSyn

    章节目录 Lock接口与Synchronized的区别及特性 队列同步器的接口与自定义锁示例 队列同步器的实现分析...

  • 队列同步器AQS

    队列同步器AQS 队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或...

  • 同步实现原理:队列同步器

    1. 队列同步器介绍 队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件...

  • ReentrantLock

    获取公平锁参考1参考2参考3参考4参考5) 公平锁和非公平锁区别自定义锁中的同步队列与等待队列JAVA 线程状态 ...

  • 如何封装同步队列的线程池

    同步队列 看到同步队列,第一想到的是AQS。队列同步器(AQS)是用来构建锁或者其他同步组件的基础框架,使用一个i...

  • 多线程

    1、同步、异步、串行、并行、全局队列、主队列2、Thread、NSOperation、GCD3、锁

网友评论

    本文标题:队列、同步与锁

    本文链接:https://www.haomeiwen.com/subject/cgwzrttx.html