场景:日志需要统计每天数据上传的次数和上传的数据量。

如果是单线程可以使用简单的int count = 0;count++,但很多情况都是多线程环境所以就不能单纯的使用count++了!!!

多线程环境采用 java.util.concurrent.atomic 下的AtomicLong类,该类的介绍可看API文档。可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。每天都要把统计的次数置为0,可以使用定时器,每天零点零分将次数重置为0,该方法不易拓展;另一种方法是使用全局变量时间戳,判断当前日期是不是与时间戳相等,如果是就说明今天的次数累加;如果不是就要把时间戳重置为当天的日期,并把次数重置为0。多线程情况下采用锁加double check方法确保解决并发问题!

 public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

 /**
* 获得当前日期
* <p>
* 日期格式yyyy-MM-dd
*
* @return
*/
public static String currentDate() {
return DATE_FORMAT.format(new Date());
}
     //上传次数
private final AtomicLong count = new AtomicLong(0); //上传数据量
private final AtomicLong dataSize = new AtomicLong(0); //时间戳
private String today = DateUtils.currentDate(); public void getLog(Integer size){
String systTime = DateUtils.currentDate();
//如果日期不是当天的
if(today!=null && !systTime.equals(today)){
synchronized (today) {
if(today!=null && !systTime.equals(today)){
today=systTime;
count.set(0);
dataSize.set(0);
}
}
}
count.incrementAndGet();
dataSize.addAndGet(size);
if(logger.isInfoEnabled()) {
logger.info(String.format("That day receive data the %sth times,total %s data !",count.get(),dataSize.get()));
}
}

还有很关键的一个问题不要忽略,就是该类是单例的,这样确保所有线程共享同一个count,dataSize只有一个对象!或者将count,dataSize设置成static!!

多线程统计次数问题:即count++的更多相关文章

  1. python之pygal:掷一个骰子统计次数并以直方图形式显示

    源码如下: # pygal包:生成可缩放的矢量图形文件,可自适应不同尺寸的屏幕显示 # 安装:python -m pip intall pygal-2.4.0-py2.py3-none-any.whl ...

  2. WPF中多线程统计拆箱装箱和泛型的运行效率

    WPF中多线程统计拆箱装箱和泛型的执行效率.使用的知识点有泛型.多线程.托付.从样例中能够看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class=&quo ...

  3. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  4. MySQL统计总数就用count(*),别花里胡哨的《死磕MySQL系列 十》

    有一个问题是这样的统计数据总数用count(*).count(主键ID).count(字段).count(1)那个效率高. 先说结论,不用那么花里胡哨遇到统计总数全部使用count(*). 但是有很多 ...

  5. JAVA多线程统计日志计数时的线程安全及效率问题

    最近工作上遇到一个需求:需要根据nginx日志去统计每个域名的qps(Query Per Second,每秒查询率)数据. 解决了日志读取等问题之后,为了写一个尽可能高效的统计模块,我决定用多线程去计 ...

  6. String中的toCharArray:将此字符串转换为新的字符数组,并统计次数

    package stringyiwen; public class StringTestToCharArray { public static void main(String[] args) { S ...

  7. poj 1806 Frequent values(RMQ 统计次数) 详细讲解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1806 题目大意:给你一个非降序排列的整数数组,你的任务是对于一系列的询问,(i,j),回答序列中出现次 ...

  8. 使用GROUP BY统计记录条数 COUNT(*) DISTINCT

    例如这样一个表,我想统计email和passwords都不相同的记录的条数 CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` ) unsigne ...

  9. 在同一个sql语句中,统计不同条件的Count数量

    前几天帮同事优化了个SQL,原写法使用多个子查询这里不再重现了,大家都遇到过这样一种情况,在项目后期的维护中, 修改别人的SQL代码,超过30行的语句,多层子查询,读起来很坑,时间久的项目伴随着人员的 ...

随机推荐

  1. Linux - /etc/passwd和/etc/shadow文件结构

    /etc/passwd文件结构 1.账号名称:         就是账号啦!用来对应 UID 的.例如 root 的 UID 对应就是 0 (第三字段):     2.口令:         早期 U ...

  2. obj-c中SEL签名和Invocation示例

    参考小示例,代码如下: #import <Foundation/Foundation.h> @interface PlayList:NSObject @property NSMutable ...

  3. mahout系列----minhash聚类

    Map: Vector featureVector = features.get(); if (featureVector.size() < minVectorSize) {       ret ...

  4. c# https请求

    遇到Https网站,c# http请求的时候,总是报SSL连接错误.后来经搜索,发现有解决方案: .net 2.0  需要引入一个第三方组件:BouncyCastle.dll,这是我写的一个例子: p ...

  5. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)

    根据前序中序构建二叉树. 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0 1 2 3 4 5 6 先序遍历为: 6 3 7为了清晰表示,我给节点上了颜色,红色是 ...

  6. 阅读spring源码

    读Spring源码之前,你要先清楚,为什么你要用Spring... Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯, ...

  7. JAVA程序员面试宝典

    程序员面试之葵花宝典 面向对象的特征有哪些方面    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...

  8. jvm性能优化及内存分区

     jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...

  9. JVM笔记8-虚拟机性能监控与故障处理工具

    1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...

  10. 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

    不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味. 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象.抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性.如果抽象 ...