@@ -34,6 +34,7 @@ of this software and associated documentation files (the "Software"), to deal
34
34
import java .util .ArrayList ;
35
35
import java .util .Arrays ;
36
36
import java .util .Calendar ;
37
+ import java .util .Collections ;
37
38
import java .util .List ;
38
39
import java .util .Map ;
39
40
import java .util .HashMap ;
@@ -1070,14 +1071,41 @@ static int currentTimestamp() {
1070
1071
return ((int )(System .currentTimeMillis () / 1000l ));
1071
1072
}
1072
1073
1073
- private static long lastTsMs ;
1074
- static synchronized long currentTimestampMs () {
1075
- long ms = System .currentTimeMillis ();
1076
- while (lastTsMs == ms ) {
1077
- ms += 1 ;
1074
+ static class TimeUniquesEnsurer {
1075
+ List <Long > lastTsMs = new ArrayList <>(10 );
1076
+ long addition = 0 ;
1077
+
1078
+ long currentTimeMillis () {
1079
+ return System .currentTimeMillis () + addition ;
1080
+ }
1081
+
1082
+ synchronized long uniqueTimestamp () {
1083
+ long ms = currentTimeMillis ();
1084
+
1085
+ // change time back case
1086
+ if (lastTsMs .size () > 2 ) {
1087
+ long min = Collections .min (lastTsMs );
1088
+ if (ms < min ) {
1089
+ lastTsMs .clear ();
1090
+ lastTsMs .add (ms );
1091
+ return ms ;
1092
+ }
1093
+ }
1094
+ // usual case
1095
+ while (lastTsMs .contains (ms )) {
1096
+ ms += 1 ;
1097
+ }
1098
+ while (lastTsMs .size () >= 10 ) {
1099
+ lastTsMs .remove (0 );
1100
+ }
1101
+ lastTsMs .add (ms );
1102
+ return ms ;
1078
1103
}
1079
- lastTsMs = ms ;
1080
- return ms ;
1104
+ }
1105
+ private static TimeUniquesEnsurer timeGenerator = new TimeUniquesEnsurer ();
1106
+
1107
+ static synchronized long currentTimestampMs () {
1108
+ return timeGenerator .uniqueTimestamp ();
1081
1109
}
1082
1110
1083
1111
/**
0 commit comments