今天碰到个以前的线上bug需要处理下:问题是这样的,我们的app里面有个点赞的功能,点赞完后显示点赞人列表以及点赞数量,但是数量现在总是不准确。之后查看代码,发现点赞时候只是简单的向数据库添加了一条点赞人的记录和统计记录,但是当多线程的时候和失败的时候,没有做多线程以及回滚处理,因此导致现在的点赞数量和总数总是不能匹配。

想到之前的学过的无锁编程:决定在原来基础上做下处理。

@POST
public ApiResult create(HttpServletRequest request,
@FormParam("topicId") String topicId,
@FormParam("type") String type,
@FormParam("val") String val) {
boolean state = false;
ConcurrentMap<String, Object> result = new ConcurrentHashMap<>(); //使用cas来进行统计 防止出现点赞重复
try {
TopicStatisticsEnum columnType = null;
if ( StringUtil.isBlank(topicId)
|| !StringUtil.isNumeric(type)
|| !StringUtil.isNumeric(val)
|| ( columnType = TopicStatisticsEnum.valueOf(Integer.valueOf(type))) == null) {
logger.info("参数错误,注意参数的可填和必填");
result.put(CODE_KEY, Code.PARAM_ILLEGAL);
result.put(MSG_KEY, Code.PARAM_ILLEGAL_MESSAGE);
return new JsonResult(result);
}
state = topicStatisticService.increaseColumnVal(Long.valueOf(topicId), columnType.toString(), getCount(Integer.valueOf(val)));
logger.info("点赞数量值:" + getCount(Integer.valueOf(val)));
result.put(CODE_KEY, state ? Code.SUCCESS : Code.ERROR);
result.put(MSG_KEY, state ? Code.SUCCESS_MESSAGE : Code.ERROR_MESSAGE);
} catch (Exception e) {
e.printStackTrace();
logger.debug("更新话题统计失败");
result.put(CODE_KEY,Code.ERROR);
result.put(MSG_KEY, Code.ERROR_MESSAGE);
}
return new JsonResult(result);
} AtomicInteger count = new AtomicInteger();
//使用AtomicInteger之后,不需要加锁,也可以实现线程安全。
private int getCount(int val) {
return count.getAndSet(val);
}

  使用了cas的方法之后调用AtomicInteger的getAndSet方法设置处理,暂时这么处理,我们的服务是按照分布式来分的,但是分布式事务这块不知道怎么处理了。

java多线程处理问题的更多相关文章

  1. Java多线程处理List数据

    实例1: 解决问题:如何让n个线程顺序遍历含有n个元素的List集合 import java.util.ArrayList; import java.util.List; import org.apa ...

  2. java多线程处理任务

    最近用到使用多线程处理给用户发送站内消息的问题,想到使用java自带的线程池进行处理这个问题,具体如下: 定义一个线程: package com.qlwb.util; import org.apach ...

  3. java多线程处理

    package com.copyFile; import java.io.BufferedReader;import java.io.File;import java.io.FileReader;im ...

  4. Java 多线程处理[全]

    http://blog.csdn.net/ghsau/article/details/7421217 Java线程(一):线程安全与不安全 http://blog.csdn.net/ghsau/art ...

  5. Java多线程处理某个线程超时的问题

    ExecutorService exec = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = ...

  6. java多线程处理导入数据拆分List集合 同步处理插入数据

    原文:https://www.2cto.com/kf/201612/581174.html import org.apache.log4j.Logger; import org.apache.poi. ...

  7. java 多线程处理一个list的集合

    原文:http://blog.csdn.net/jenny8080/article/details/52100312 import java.util.ArrayList; import java.u ...

  8. Java多线程处理任务(摘抄)

    很多时候,我们需要对一个庞大的队列或者二维数组进行处理.这些处理可能是循环的,比如给一个excel多个sheet的联系人列表发邮件.很幼稚的方法就是用一个或者两个FOR循环搞定,对于庞大的数据有得让你 ...

  9. Java以基础类库

    Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中. (一)java.lang包 Java最常用的包都属于该包, ...

随机推荐

  1. golang (4) golang 操作mongdb

    1. 数据按照时间聚合操作 1.1 正常的数据结构 { "_id" : ObjectId("5cac8d7b1202708adf5d4b64"), " ...

  2. [Xamarin.Android]如何引用JAR檔案 (转帖)

    這個範例是如何在Xamarin.Android中去使用一個我們自行在開發的JAR檔案. 主要會執行的步驟如下 1. 在Xamarin建立一個Android Java Bindings Library ...

  3. C#方法重载和方法重写的区别

    一.重载的条件: 1.必须在同一个类中: 2.方法名必须相同: 3.参数列表不能相同. 二.重写的条件: 1. 在不同的类中2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致(必须具有相 ...

  4. SpringMVC 过滤器

    参考: http://qq-22530757.iteye.com/blog/2177513 http://www.jdon.com/dl/best/spring-security.html https ...

  5. WPF中C#代码触发鼠标点击事件

    1.如下代码; <Button x:Name="btnTest" Click="btnTest_Click"> <Button.Trigger ...

  6. 使用VNC访问Linux桌面

    在一个严重依赖Windows的工作环境中,比如电子邮件被限定为Outlook(因为加密要求), VPN软件不支持Linux版本,那么,只使用Linux桌面是不够的,还需要在Linux桌面上跑个虚拟机运 ...

  7. Win10正式版关机时自动更新怎么关闭

    http://jingyan.baidu.com/article/64d05a02462d6fde55f73b97.html

  8. 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转

    http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...

  9. IOS9网络请求报错:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

    今天下载Xcode7试了下,运行项目时报上面的错误,网上查了下原来iOS9引入了新特性App Transport Security (ATS).详情:App Transport Security (A ...

  10. 移动端的touchstart,touchmove,touchend事件中的获取当前touch位置

    前提:touchstart,touchmove,touchend这三个事件可以通过原生和jq绑定. 原生:document.querySelector("#aa").addEven ...