如何缩小同步的范围

来源:9-3 Spring与线程安全

目科将

2018-08-01

老师,我在模拟并发写文件(即传一个日期,把当天的数据生成到以日期命令的文件里) 时有一个问题,代码如下

@Servcie
public class WriteFileServiceImpl {
	

    private static final String ROOT_PATH = "";

    //标识正在处理当前文件
    private static final String FLAG = "_DOING";
    
	public boolean  write(File file,Localdate date){
	   if(check(date)){
	     return false;
	   }
	   // eg. write file with data for date

	   return true;
	}

	//加锁是担心在 标识文件 没有生成之前 有多个处理 同一天的请求 进入该方法
	private synchronized boolean check(Localdate date){
	     if(new File(rootPath+"/"+date+"/"+FLAG).exists){
	        // create then flag file;
	        return false;
	     }elses{
	        return true;
	     }
	}
}

因为我没有配置scope,默认是单例的,这样就会有一个问题,若我处理不同天的请求,也会等待进入check方法,针对这种情况,我应该如何写同步逻辑,确保只针对同一天的请求才需要加锁等待

写回答

1回答

Jimin

2018-08-02

你好,你这个不加synchronized貌似也不会有线程安全问题吧,你现在date变量是每次传入方法来的,属于堆栈封闭,如果date是static修饰的全局变量,才需要synchronized。这个方法是没问题的,你只需要保证传入的date是正确的就ok的,多个线程间不存在共享的变量。
0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程