背景
制造模拟数据,一次生成5000000条数据,每500条数据向数据库中插入一次示例。
正确代码示例:
package testClass;
import java.util.ArrayList;
import java.util.List;
public class ScopeClass {
public static Integer global=0;
public static Integer count=0;
public static void main(String[] args) {
//分多少次向数据库中插入数据,这里是两次
for (int i=0; i <2; i++){
List<Integer> result = DealData.dealData(global);
count += result.size();
global = count;
}
System.out.println("count="+count);
}
}
package testClass;
import java.util.ArrayList;
import java.util.List;
public class DealData {
//一次生成多少条数据,这里5条
public static List<Integer> dealData(Integer global){
System.out.println("入参global="+global);
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++){
global++;
list.add(global);
System.out.println("gl="+global);
}
return list;
}
}
输出的结果:
错误代码示例
package testClass;
import java.util.ArrayList;
import java.util.List;
public class ScopeClass {
public static Integer global=0;
public static Integer count=0;
public static void main(String[] args) {
//分多少次向数据库中插入数据,这里是两次
for (int i=0; i <2; i++){
List<Integer> result = DealData.dealData(global);
count += result.size();
}
System.out.println("count="+count);
}
}
package testClass;
import java.util.ArrayList;
import java.util.List;
public class DealData {
//一次生成多少条数据,这里5条
public static List<Integer> dealData(Integer global){
System.out.println("入参global="+global);
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++){
global++;
list.add(global);
System.out.println("gl="+global);
}
return list;
}
}
输出的结果
分析
两个成员变量,每执行完一次,都会重新把成员变量的默认值赋值为定义的值,所以每次执行完都要,将最后结果赋值给成员变量更新。保证数据每次都会接着上传自增。
原子变量的操作
当在并发的情况下,上面的代码,可能会出现脏数据。对上面的优化,需要我们使用原子变量进行操作。
正确的代码示例:
package testClass;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class ScopeSynchronizedClass {
public static AtomicInteger at = new AtomicInteger(0);
public static Integer count = 0;
public static void main(String[] args) {
//分两次插入数据
for (int i = 0; i < 2; i++){
List<AtomicInteger> result = DealData.SynDealData(at);
count += result.size();
//关键在这需要重置一下变量内容
at.set(count);
System.out.println("at1="+at.get());
}
}
}
package testClass;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class DealData {
//安全自增1
public static List<AtomicInteger> SynDealData(AtomicInteger at){
System.out.println("入参at="+at);
List<AtomicInteger> list = new ArrayList<>();
for (int i = 0; i < 5; i++){
at.incrementAndGet();
list.add(at);
System.out.println("at="+at);
}
return list;
}
}
输出的结果
加微信群一块学习讨论技术Day9884125