Android多线程研究(9)——读写锁
来源:互联网 发布:shadowsock linux版本 编辑:程序博客网 时间:2024/05/07 06:00
一、什么是锁
在Java的util.concurrent.locks包下有关于锁的接口和类如下:
先看一段代码:
package com.codeing.snail.test;public class ReadWriteLockTest {public static void main(String[] args) {final Output output = new Output();new Thread(){public void run() {while(true){output.output("CodeingSnail");}};}.start();new Thread(){public void run() {while(true){output.output("阳光小强");}};}.start();}static class Output{public void output(String name){char[] arry = name.toCharArray();for(int i = 0; i < arry.length; i++){System.out.print(arry[i]);}System.out.println();}}}
输出的结果如下:
如果我们想让“CodeingSnail"和“阳光小强"两个字符串都能完整输出,就需要使用synchronized关键字将输出部分声明,如下:
public synchronized void output(String name){char[] arry = name.toCharArray();for(int i = 0; i < arry.length; i++){System.out.print(arry[i]);}System.out.println();}
其实,除了synchronized关键字之外,还可以使用锁(Lock)来实现同步。
ReentrantLock lock = new ReentrantLock();public void output(String name){lock.lock();try{char[] arry = name.toCharArray();for(int i = 0; i < arry.length; i++){System.out.print(arry[i]);}System.out.println();}finally{lock.unlock();}}上面代码使用try...finally语句块是为了防止出现异常执行不到unlock方法,ReentrantLock是Lock的实现类,Lock的作用和synchronized类似,但更加面向对象,要实现同步就必须使用同一个lock对象。
二、什么是读写锁
读写锁、分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥。下面我们来看一下API文档中的一个缓存器的例子:
class CachedData {Object data;volatile boolean cacheValid;final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); try { // Recheck state because another thread might have // acquired write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); } finally { rwl.writeLock().unlock(); // Unlock write, still hold read } } try { use(data); } finally { rwl.readLock().unlock(); } }}假如有多个线程来读取数据,第一个线程进来先上一把写锁进行数据写入(先释放读锁),写入完成后将写锁降级为读锁(第15行),其他线程在读取数据的时候上读锁后互不影响。这样可以提高读取效率。
14 2
- Android多线程研究(9)——读写锁
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(2)——定时器
- Android多线程研究(6)——多线程之间数据隔离
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- 多线程同步——读写锁
- 多线程例子—读者,作家使用读写锁(SRWLOCK)
- android sqlite多线程读写
- Android多线程研究(1)——线程基础及源码剖析
- Android多线程研究(3)——线程同步和互斥及死锁
- Android多线程研究(4)——从一道面试题说起
- Android多线程研究(5)——线程之间共享数据
- Android多线程研究(7)——Java5中的线程并发库
- Android多线程研究(8)——Java5中Futrue获取线程返回结果
- Android多线程研究(8)——Java中的原子性理解
- .Net Micro Framework研究—IO读写
- .Net Micro Framework研究—IO读写
- HALCON形状匹配
- 数字证书原理
- Effective STL: 使用swap来修整过剩容量
- java.lang.ClassNotFoundException: Cannot find class: DB_VENDOR
- 关键字static的作用及关键字const含义
- Android多线程研究(9)——读写锁
- POJ 3037 Skiing SPFA
- usb3.0cd-rom
- Linux access 函数
- 2014.09.15
- 面试总结:用Java搞定二叉树方面的面试题
- 序列化简介
- oc面向对象概述
- 颜色、字体