扫码关注官方订阅号
验证用户信息时,先查找用户信息,如果没有则创建一条消息,在并发的时候,会发现,出现两条相同的用户信息。 目前我的解决方案是:建索引,将第二次插入报错屏蔽。我想问的是,有没有技术能更好的解决这类并发问题
走同样的路,发现不同的人生
“如果没有则创建一条消息”
// Case 1. 该条消息有且仅有一条创建的业务逻辑该种情况下只需将该段代码同步或加锁,即可避免在高并发下发生脏读的问题。
// Case 2. 该条消息有多处创建的业务逻辑建议将 查询-创建 操作原子化,通过为user加一个Unique字段即可实现。
======== 2016-02-22 更新 ========
“不同用户创建数据不应该相互影响,那么该如何应用同步或者锁”
建议新建一个账户锁类,然后使用它来锁定。代码如下:
import java.util.concurrent.ConcurrentHashMap; /** * AccountLock 为单独的账号加锁 */ public class AccountLock { private final ConcurrentHashMap accounts = new ConcurrentHashMap(); public synchronized void lock(String account) throws InterruptedException{ while ( accounts.contains(account) ){ wait(); } accounts.put(account, true); } public synchronized void release(String account) { accounts.remove(account); notify(); } }
具体业务逻辑下:
private static final AccountLock lock = new AccountLock(); public void createAccount(/* 传参 */) { String account = /* 账号 */; lock.lock(account); try { //业务逻辑 } finally { lock.release(account); } }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
// Case 1. 该条消息有且仅有一条创建的业务逻辑
该种情况下只需将该段代码同步或加锁,即可避免在高并发下发生脏读的问题。
// Case 2. 该条消息有多处创建的业务逻辑
建议将 查询-创建 操作原子化,通过为user加一个Unique字段即可实现。
======== 2016-02-22 更新 ========
建议新建一个账户锁类,然后使用它来锁定。代码如下:
具体业务逻辑下: