java多线程处理问题
今天碰到个以前的线上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多线程处理问题的更多相关文章
- Java多线程处理List数据
实例1: 解决问题:如何让n个线程顺序遍历含有n个元素的List集合 import java.util.ArrayList; import java.util.List; import org.apa ...
- java多线程处理任务
最近用到使用多线程处理给用户发送站内消息的问题,想到使用java自带的线程池进行处理这个问题,具体如下: 定义一个线程: package com.qlwb.util; import org.apach ...
- java多线程处理
package com.copyFile; import java.io.BufferedReader;import java.io.File;import java.io.FileReader;im ...
- Java 多线程处理[全]
http://blog.csdn.net/ghsau/article/details/7421217 Java线程(一):线程安全与不安全 http://blog.csdn.net/ghsau/art ...
- Java多线程处理某个线程超时的问题
ExecutorService exec = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = ...
- java多线程处理导入数据拆分List集合 同步处理插入数据
原文:https://www.2cto.com/kf/201612/581174.html import org.apache.log4j.Logger; import org.apache.poi. ...
- java 多线程处理一个list的集合
原文:http://blog.csdn.net/jenny8080/article/details/52100312 import java.util.ArrayList; import java.u ...
- Java多线程处理任务(摘抄)
很多时候,我们需要对一个庞大的队列或者二维数组进行处理.这些处理可能是循环的,比如给一个excel多个sheet的联系人列表发邮件.很幼稚的方法就是用一个或者两个FOR循环搞定,对于庞大的数据有得让你 ...
- Java以基础类库
Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中. (一)java.lang包 Java最常用的包都属于该包, ...
随机推荐
- centos 7 查看所有登录用户的操作历史
2019-01-07 转自 https://www.cnblogs.com/kevingrace/p/7373146.html centos 7 查看所有登录用户的操作历史 在Linux系统的环境下 ...
- Hibernate3.3.2_ID生成策略
1,xml生成id generator:常用四个:native.identity.sequence.uuid. Annotation: 1,@GeneratedValue: a)自定义ID b)AUT ...
- hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz的集群搭建(单节点)(Ubuntu系统)
前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/ ...
- python 脚本备份 mysql 数据库到 OSS
脚本如下: #!/usr/bin/python ########################################################### ################ ...
- android studio不能预览
错误:Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported major.minor versi ...
- 从零开始学JAVA(07)-使用SpringMVC4写helloworld
一.关于开发环境 Eclipse IDE for Java EE Developers Jdk 1.7 (32位版本) SpringMVC 4.1.5.RELEASE apache-tomcat-7. ...
- shell脚本分析apache日志状态码
一.首先将apache日志按天切割 vi /etc/httpd/conf/httpd.conf ErrorLog "|rotatelogs /var/log/httpd/%Y% ...
- MVC缓存(一)
//OutputCache是设置缓存,参数Duration设置缓存的过期时间,OutputCache可以加到Controller上,也可以加到Action上,但是当Controller与Action都 ...
- FileSystemWatcher 监视指定目录中的变更
.Net框架类库中的FileSystemWatcher如它的名称一样是一个用于监视文件系统变化的一个控件.使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录 ...
- MySQL 数据类型总结及选取准则
整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用 8 , 16 24, ...