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;
        }
    
    } 
    
  • 相关阅读:
    query compiler
    non-deterministic-turing-machine
    What-are-P-NP-NP-complete-and-NP-hard
    查询优化器的算法
    Redis 和 I/O 多路复用
    Linux aio
    MySQL 的那些网络超时错误
    MYSQL performance
    jvmti
    JVM Troubleshooting
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311058.html
Copyright © 2011-2022 走看看