队列、同步与锁
来源:互联网 发布: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
- 队列、同步与锁
- 自定义锁中的同步队列与等待队列
- 线程同步与双队列
- 线程同步与双队列
- 关于线程同步与双队列性能
- 关于线程同步与双队列性能
- 队列和同步锁备忘
- AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制
- AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制
- Java并发编程 之 同步队列与等待队列
- AQS同步队列与条件队列的关系
- 同步队列
- 同步队列
- Java同步队列(非阻塞队列与阻塞队列)——java并发容器
- android 随笔——队列、同步、锁
- 多用派发队列,少用同步锁
- 关于线程同步与双队列性能(转载)
- 【VxWorks系列】任务间同步与通信之消息队列
- 关于shell下出现"未预期的符号问题"
- CAAnimationGroup-核心动画组
- 北科大-关于mos驱动的讲解
- 功能测试方法与实际测试内容
- 设置mysql数据库使用utf8编码
- 队列、同步与锁
- JS加载的集中情况
- hdu1205 吃糖果 (鸽巢原理)
- ListView刷新指定item
- OBJ文件格式简介
- eclipse 方便快捷安装svn
- Objective-C开发-Foundation框架
- CardView
- XCode6添加自定义framework运行真机出现dyld: Library not loade