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;
        }
    
    } 
    
  • 相关阅读:
    SQL SERVER的检查点checkpoint
    MySQL备份说明
    声明对象和创建对象的区别
    getParameter的用法总结
    Jsp的九大对象,七大动作,三大指令
    为什么内部类访问的外部变量需要使用final修饰
    java synchronized详解
    网上选课系统需求说明书
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311058.html
Copyright © 2011-2022 走看看