public void write(Uers u){ // do something }但是有一种情况(1%的情况下吧)的就是有的用户会发两次甚至更多次写请求(因为数据库限制,我们不方便在主键上做文章)。
public void write(Uers u){ if(!checkIfExistUser(u)){ // do something } }不过最大的问题就是,如果用户几乎在瞬时,发送了两个写操作。
public synchronized void write(Uers u){ if(!checkIfExistUser(u)){ // do something } }当然,我们得承认,有了上面的方法,就不会出现,数据库里有两条张三的记录了
public synchronized void write(Uers u){ synchronized(u.getUserId.intern()) { // do something } }上面的思路就保证了张三写的时候,李四可以写,但是不能两个张三一块写。
public synchronized void write(Uers u){ String userSuffix=getSuffix(u); synchronized(userSuffix.intern()) { // do something } }至于那个获得后缀的策略,大家自己想。
Map locks = new Map(); List lockKeys = new List(); for(int number : 1 - 10000) { Object lockKey = new Object(); lockKeys.add(lockKey); locks.put(lockKey, new Object()); } public void doSomeThing(String uid) { Object lockKey = lockKeys.get(uid.hash() % lockKeys.size()); Object lock = locks.get(lockKey); synchronized(lock) { // do something } }个人感觉和方法三的核心差不多。
原文:http://blog.csdn.net/dlf123321/article/details/57955491