需求场景:
需要使用时间戳来命名上传图片名称,同时以时间戳知道上传时间
问题:
1.一个进程某个时间点多次请求(图片批量上传),生成时间戳时,时间戳重复
2.当多进程请求(多用户请求)生成时间戳时,时间戳重复
解决方法:
1.针对第一个,在方法内添加几毫秒的延时(Thread.sleep(3))
2.针对第二个,对方法添加同步锁(synchronized)
验证1:同个时间点多次请求
public class MyTest {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
//t2.start();
//t3.start();
}
}
public class MyThread extends Thread{
static int num=0;
@Override
public void run() {
while (true){
if(num<99){
num++;
//test_sync();
test();
}else {
break;
}
}
}
public static void test(){
System.out.println(num +"当前时间"+ System.currentTimeMillis());
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
没有添加延时,存在相同的时间戳
1当前时间1690876719760
2当前时间1690876719762
3当前时间1690876719763
4当前时间1690876719763
5当前时间1690876719766
6当前时间1690876719767
7当前时间1690876719767
8当前时间1690876719767
9当前时间1690876719768
添加Thread.sleep(3)后,没有重复的时间戳
1当前时间1690876866280
2当前时间1690876866285
3当前时间1690876866316
4当前时间1690876866321
5当前时间1690876866324
6当前时间1690876866332
7当前时间1690876866336
8当前时间1690876866340
9当前时间1690876866363
验证2:添加同步锁
//多个进程请求
t1.start();
t2.start();
t3.start();
public static synchronized void test_sync(){
System.out.println(num +"当前时间"+ System.currentTimeMillis());
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
未加同步锁,存在重复时间戳
1当前时间1690877099584
2当前时间1690877099593
3当前时间1690877099603
4当前时间1690877099604
5当前时间1690877099604
6当前时间1690877099606
7当前时间1690877099608
8当前时间1690877099608
9当前时间1690877099609
test_sync();
//test();
添加同步锁后没有重复的时间戳
1当前时间1690877244878
3当前时间1690877244882
5当前时间1690877244892
6当前时间1690877244895
7当前时间1690877244898
8当前时间1690877244901
9当前时间1690877244904
9当前时间1690877244909
9当前时间1690877244913