java读写锁

Java61

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

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

_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();

//先去map查询是否存在该流水号的写锁对象
if (paycertifyMap.putIfAbsent(bizMnPaycertifyVO.getHkls(), lock) != null) {
//map已存在数据,赋值
lock = paycertifyMap.putIfAbsent(bizMnPaycertifyVO.getHkls(), lock);
}

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长