zoukankan      html  css  js  c++  java
  • 锁降级--防止线程安全问题

    package com.demo.lock.writer.to.read;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    /**
     * 
     * 锁降级:是将写锁降级为读锁
     * 即为:在获取到写锁后,接着又获取到读锁后,此时再释放写锁
     * 
     * @author Administrator
     *
     */
    public class WriteToReadLockDemo {
    
        private volatile boolean isUpdate;
        private ReadWriteLock rwLock = new ReentrantReadWriteLock();
        private Map<String, Object> map = new HashMap<String, Object>();
        private Lock rLock = rwLock.readLock();
        private Lock wLock = rwLock.writeLock();
    
        public void method() {
            /*
             * 不同线程之间,读写锁是互斥的,同一个线程锁是可重入的
             * 为了当有线程获取了写锁时,其它线程想获取读锁,也会等待写锁释放时,才可以进行
             * 其实质就是为了当有线程在修改isUpdate值时,此时不能去读取isUpdate值
             */
            rLock.lock();
            if (isUpdate) {//添加volatile:为了保证当前线程修改了 isUpdate值对其它线程是可见的,
                rLock.unlock();//释放读锁
                /*
                 * 步骤 1 2 3 即为锁降级
                 */
                wLock.lock();//获取写锁 1
                map.put("xxx", "xxxx");
                rLock.lock();//获取读锁(防止还没有将map设置的值取出--步骤4,又有其它线程获取到写锁,对map进行重新赋值) 2
                wLock.unlock();//释放写锁 3
            }
            Object object = map.get("xxx");//4
            System.out.println(object);
            rLock.unlock();
        }
        
    }
  • 相关阅读:
    日报9.4
    日报9.3
    低级错误整理
    树状数组求逆序对 笔记与思路整理
    st表、树状数组与线段树 笔记与思路整理
    Luogu P1098 字符串的展开
    Luogu P1816 忠诚
    jmeter cookie管理器 使用方法---新手学习记录1
    kali nessus 安装插件失败解决方法
    https tomcat 证书搭建
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/10078823.html
Copyright © 2011-2022 走看看