优化代码 public static String test1(User data) { String result = null; if (data.getNum() > 0) { String id = data.getId(); synchronized (data.getId().intern()) { List<User> dataList = cache.getOrDefault(id, null); if (dataList == null) { // 如果缓存中不存在该 id 对应的列表,则创建一个空列表并添加到缓存中 dataList = new ArrayList<>(); cache.put(id, dataList); } // 将新的数据添加到列表中 dataList.add(data); if (dataList.size() == data.getNum()) { // 如果数据已经全部接收到,则进行排序和拼接操作 result = dataList.stream().map(User::getParam).collect(Collectors.joining()); // 从缓存中移除该 id 对应的列表 cache.remove(id); } } } else { result = data.getParam(); } return result; } 使其在被多线程调用比单线程快
时间: 2024-04-22 18:22:40 浏览: 26
在多线程环境下,可以使用ConcurrentHashMap代替HashMap,并使用putIfAbsent方法来避免多个线程同时创建同一个id对应的列表,从而减少锁的争用。同时,可以使用CopyOnWriteArrayList代替ArrayList来避免多个线程同时修改同一个列表,从而提高并发性能。改写后的代码如下:
private static ConcurrentHashMap<String, CopyOnWriteArrayList<User>> cache = new ConcurrentHashMap<>();
public static String test2(User data) {
String result = null;
if (data.getNum() > 0) {
String id = data.getId();
CopyOnWriteArrayList<User> dataList = cache.putIfAbsent(id, new CopyOnWriteArrayList<>());
dataList = dataList == null ? cache.get(id) : dataList;
dataList.add(data);
if (dataList.size() == data.getNum()) {
result = dataList.stream().map(User::getParam).collect(Collectors.joining());
cache.remove(id);
}
} else {
result = data.getParam();
}
return result;
}
在这个改写后的代码中,多线程同时访问cache时不会发生锁的争用,同时CopyOnWriteArrayList的写操作是通过复制整个列表来实现的,因此也不会发生并发修改异常。因此,在多线程环境下,该代码比单线程更快。