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;
        }
    
    } 
    
  • 相关阅读:
    网络编程的基础
    day31作业
    异常处理其他内容
    异常处理的使用
    常见的异常种类
    ansible条件使用--实践
    Ansible的循环
    Ansible的条件语句
    ansibleplaybook的使用
    ansible官方文档翻译之变量
  • 原文地址:https://www.cnblogs.com/luleiitlife/p/8545084.html
Copyright © 2011-2022 走看看