zoukankan      html  css  js  c++  java
  • java 线程读写锁

    共享的数据,只能有一个线程可以写该数据,但可以有个多个线程同时读该数据
    Lock比传统的线程中的synchronized方式更面向对象。两个线程执行的代码要实现同步互斥,他们必须用同一个Lock对象,锁加在类的内部方法中,而不是线程代码中。
    读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥

    package thread;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;public class CacheDemo {
        private Map<String,Object> cache=new HashMap<String,Object>();
        private ReadWriteLock lock=new ReentrantReadWriteLock();
        public Object getData(String key){
            //添加读锁,读锁运行多个线程同时进入(多人同时读)
            lock.readLock().lock();
            Object value=null;
            try {
                value=cache.get(key);
                if(value==null){
                    //如果没有数据库时,释放读锁,并且添加写锁
                    lock.readLock().unlock();
                    //此时,同一时刻,只能有一个线程写数据,其他线程阻塞
                    lock.writeLock().lock();
                    try {
                        //第一个线程写完释放写锁后,有可能第二个线程进来再写,所以再判断一次
                        if(value==null){
                            value="去查询数据库";//此处去查询数据库
                        }
    
                    }finally{
                        //释放写锁
                        lock.writeLock().unlock();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                //释放读锁
                lock.readLock().unlock();
            }
            return value;
        }
    
    } 
    
  • 相关阅读:
    MySQL数据表类型 = 存储引擎类型
    删除链表节点
    链表逆序(反转)
    腾讯2012笔试题
    MysqL数据表类型
    进程间的通信方式
    网络套接字编程学习笔记一
    HTTP报头
    C语言排序算法
    交换排序经典的冒泡排序算法总结
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311059.html
Copyright © 2011-2022 走看看