码迷,mamicode.com
首页 > 其他好文 > 详细

读写锁

时间:2016-07-06 18:37:17      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:reentrantreadwritelock


读写锁ReentrantReadWriteLock


      读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!

三个线程读数据,三个线程写数据示例:
可以同时读,读的时候不能写,不能同时写,写的时候不能读。
读的时候上读锁,读完解锁;写的时候上写锁,写完解锁。

例子:

        /**

         *  读写锁 

         * @author Administrator 

         */

        public class ReadWriteLockTest {

        public static void main(String[] args) {

        final ReadWrite rw = new ReadWrite();

        for (int i = 0; i < 3; i++) {

        new Thread() {

        public void run() {

        while (true) {

        rw.read();

        }

        }

        }.start();

        new Thread() {

        public void run() {

        while (true) {

        rw.write(new Random().nextInt(10000));

        }

        }

        }.start();

        }

        }

        }

        

        /**

         * 读和写要互斥,因此要把它们放在同一个类中

         * 

         * @author Administrator *

         */

        class ReadWrite {

        private Object data = null;// 共享数据,只能有一个线程写该数据,但可以有多个线程同时读该数据。

        ReadWriteLock rwl = new ReentrantReadWriteLock();

        

        /* 读数据 */

        public void read() {

        rwl.readLock().lock();

        try {

        System.out.println(Thread.currentThread().getName()

        " be ready to read data!");

        Thread.sleep((long) (Math.random() * 1000));

        System.out.println(Thread.currentThread().getName()

        "have read data :" + data);

        catch (InterruptedException e) {

        e.printStackTrace();

        finally {

        rwl.readLock().unlock();

        }

        }

        

        /*写数据 */

        public void write(Object data) {

        rwl.writeLock().lock();

        try {

        System.out.println(Thread.currentThread().getName()

        " be ready to write data!");

        Thread.sleep((long) (Math.random() * 1000));

        this.data = data;

        System.out.println(Thread.currentThread().getName()

        " have write data: " + data);

        catch (InterruptedException e) {

        e.printStackTrace();

        finally {

        rwl.writeLock().unlock();

        }

        }

        }


设计一个缓存系统


        /**

         * 设计一个缓存系统

         * 

         * @author Administrator

         * 

         */

        public class CacheDemo {

        private Map<String, Object> cache = new HashMap<String, Object>();

        private ReadWriteLock rwl = new ReentrantReadWriteLock();

        

        public Object getData(String key) {

        rwl.readLock().lock(); // 上读锁

        Object value = null;

        try {

        value = cache.get(key); // 先查询内部存储器中有没有要的值

        if (value == null) { // 如果没有,就去数据库中查询,并将查到的结果存入内部存储器中

        // 释放读锁、上写锁

        rwl.readLock().unlock();

        rwl.writeLock().lock();

        try {

        if (value == null) { // 再次进行判断,防止多个写线程堵在这个地方重复写

        System.out.println("read data from database");

        value = "张三";

        cache.put(keyvalue);

        }

        finally {

        // 设置完成 释放写锁

        rwl.writeLock().unlock();

        }

        // 恢复读写状态

        rwl.readLock().lock();

        else {

        System.out.println("read data from cache");

        }

        finally {

        rwl.readLock().unlock(); // 释放读锁

        }

        return value;

        }

        }

        

本文出自 “德泽无忧” 博客,谢绝转载!

读写锁

标签:reentrantreadwritelock

原文地址:http://dezewuyou.blog.51cto.com/2628602/1808245

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!