在涉及到多线程并发处理业务时,如果有修改公共资源的时候,往往存在着线程安全问题,这时我们往往会使用一些方法来避免线程不安全,例如:使用lock加锁,synchronized同步这些悲观锁或者使用版本号等乐观锁;
如果这时候有这么个需求,一个业务是各公司提交修改公司销售额;这时其实并发修改的是各公司的销售表,如果同步整个方法可能性能稍微降低;如果时候乐观锁可能出现并发时某些修改失败的问题,当然如果使用重试机制,在高并发时可能也会导致性能下降;这时我们可以使用控制同步各公司的方式,使不同公司间并发修改互不影响的解决方案,大致实现如以下:
1.控制层:
@RestController
public class SyncParam {
//定义一个容器用于存储 公司及对应的锁
private static Map<String, Lock> map = new ConcurrentHashMap<>();
@Autowired
SyncParamService syncParamService;
@GetMapping("lockByName")
public Object test(String lockName) {
//每次收到请求时,拿出公司对应的锁
Lock o = map.putIfAbsent(lockName, new ReentrantLock());
if (o == null) {
o = map.get(lockName);
}
return syncParamService.test(o);
}
}
2.业务层:
@Service
public class SyncParamService {
public Object test(Lock lock) {
try {
//对业务加锁
lock.lock();
//todo somethings
return "成功";
} finally {
//完成后释放锁
lock.unlock();
}
}
}
以上也可以使用synchronized 同步代码块的方式,对各公司对应的对象进行同步操作;