java读写锁

工作遇到了金钱计算,需要用到读写锁保证数据安全。记录一下。

单纯读没有限制,读写、写写的时候会有安全问题。

_hashMap_存在并发线程安全问题,而 _hashtable_线程安全但每次修改的时候使用 _synchronized_锁住整个表效率很低。推荐使用 _ConcurrentHashMap 。_但 _ ConcurrentHashMap_只是保证了put()、get()操作是线程安全。连续的俩个或多个原子操作逻辑后并不一定线程安全,并发问题依然存在。使用putIfAbsent()方法可以同时达到put,get效果,保证了一次读写的数据同步。putIfAbsent(key,value)存数据的时候会根据key去容器中查询,查询到就返回原容器中key对应的value值,并没有更新value值。查询不到的时候就将key,value存入然后返回null。 _ConcurrentHashMap_使用分段锁提高性能。

static ConcurrentHashMap <string, reentrantreadwritelock> paycertifyMap=new ConcurrentHashMap<>();</string,>

使用map存储流水号和读写锁对象,需要使用的时候 根据从map查询出锁对象然后 tryLock() 只会尝试一次获取锁对象,成功获取返回true。而 lock()获取不到锁时休眠等待获取为止。然后常规使用 即可。

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

//&#x5148;&#x53BB;map&#x67E5;&#x8BE2;&#x662F;&#x5426;&#x5B58;&#x5728;&#x8BE5;&#x6D41;&#x6C34;&#x53F7;&#x7684;&#x5199;&#x9501;&#x5BF9;&#x8C61;
if (paycertifyMap.putIfAbsent(bizMnPaycertifyVO.getHkls(), lock) != null) {
        //map&#x5DF2;&#x5B58;&#x5728;&#x6570;&#x636E;&#xFF0C;&#x8D4B;&#x503C;
        lock = paycertifyMap.putIfAbsent(bizMnPaycertifyVO.getHkls(), lock);
    }
    //&#x7B49;&#x4E8E;null &#x6DFB;&#x52A0;&#x6210;&#x529F; &#x9501;&#x5BF9;&#x8C61;&#x4E3A;&#x65B0;&#x589E;&#x7684;lock
    if (!lock.writeLock().tryLock()) {
        //&#x83B7;&#x53D6;&#x9501;&#x5931;&#x8D25;
        return -1;
    }
    //&#x83B7;&#x53D6;&#x9501;&#x6210;&#x529F;
    try {
        //&#x6D4B;&#x8BD5;&#x5E76;&#x53D1;
        Thread.sleep(5000);
        //&#x903B;&#x8F91;&#x65B9;&#x6CD5;
        paycertifyAddUpdate(bizMnPaycertifyVO);
    } catch (Exception e) {
        logger.error("&#x65B0;&#x589E;/&#x4FEE;&#x6539;&#x652F;&#x4ED8;&#x51ED;&#x8BC1;&#x5F02;&#x5E38;" + e);
    } finally {
        //&#x91CA;&#x653E;&#x9501;
        //&#x4E00;&#x822C;&#x91CA;&#x653E;&#x9501;&#x9700;&#x8981;&#x5224;&#x65AD;&#x662F;&#x5426;&#x7531;&#x8BE5;&#x7EBF;&#x7A0B;&#x83B7;&#x53D6;&#x7684;&#x9501;&#xFF0C;&#x907F;&#x514D;&#x91CA;&#x653E;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x9501;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x4E86;ConcurrentHashMap&#x4FDD;&#x8BC1;&#x4E86;&#x540C;&#x4E00;&#x65F6;&#x95F4;&#x53EA;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6301;&#x6709;&#x8BE5;&#x9501;
        lock.writeLock().unlock();

    }
    return 0;

java读写锁

Original: https://www.cnblogs.com/cking98/p/16277645.html
Author: 林间小路
Title: java读写锁

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620422/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球