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();
        }
        
    }
  • 相关阅读:
    面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
    JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!
    面经分享:看非科班研究生如何转行斩获 ATM 大厂的 Offer ?
    Jmeter JDBC配置
    Jmeter JDBC连接
    js基础用法1
    java实现io读取数据
    mysql语句
    java修改linux文件
    linux永久或临时修改dns
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/10078823.html
Copyright © 2011-2022 走看看