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