请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

如何缩小同步范围

接上一个问题(http://coding.imooc.com/learn/questiondetail/71817.html), 我的测试代码及现象如下:

public static void main(String[] args) {
		ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("doing-%d").build();
		ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MINUTES,
				new LinkedBlockingQueue<Runnable>(1), threadFactory, new ThreadPoolExecutor.AbortPolicy());
		final FileService fileService = new FileService();
		for (int i = 0; i < 100; i++) {
			executor.execute(new Runnable() {
				@Override
				public void run() {
					fileService.write("20180802");
				}
			});
		}
		executor.shutdown();
}

public static class FileService {
		private static final String TEST_DIR = "/test4mut";
		private static final String FLAG = "/_DOING";
		public void write(String date){
			if(check(date)){
				System.out.println(Thread.currentThread().getName() + " doing....");
			}else{
				//System.out.println("---------");
			}
		}
		public boolean check(String date){

			String dir = TEST_DIR+date;
			File flag = new File(dir+FLAG);

			if(flag.exists()){
				return false;
			}else{
				try {
					flag.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return true;
		}
 }	

运行结果:

doing-0 doing....
doing-1 doing....

想问下老师,我上面那个同步应该怎么编写

正在回答

1回答

你好,我先说一下我的理解,你现在是起多个线程去创建同一个文件是吧,然后这样很可能在 flag.createNewFile();时抛出异常,你问的是这种情况下如何避免对吧,如果是的话,你可以对

if(flag.exists()){

    return false;

}else{

    try {

        flag.createNewFile();

    } catch (IOException e) {

        e.printStackTrace();

    }

}

这段代码加上同步手段。主要是保证 flag.exists() 和 flag.createNewFile(); 两个操作的原子性。




0 回复 有任何疑惑可以回复我~
  • 提问者 目科将 #1
    老师,可能是我描述的有问题,我的本意是,多个线程,创建不同的以日期为名的目录,然后在目录里写当天的数据,若有两个线程写同一个日期的数据,我是需要加锁的,但若是不同的线程写不同的日期是不需要加锁的,如果是在上面那段代码加锁的话,那我不同的线程写不同的日期也是需要等待,(这不是个真实需求,只是在学习课程想到的)
    回复 有任何疑惑可以回复我~ 2018-08-02 23:23:47
  • Jimin 回复 提问者 目科将 #2
    这个时候更适合来一把分布式锁,通过日期动态生成一个key,作为锁的对象。这样分布式环境下,这个文件也只有一个线程去处理了。
    回复 有任何疑惑可以回复我~ 2018-08-02 23:33:22
  • 提问者 目科将 回复 Jimin #3
    谢谢老师
    回复 有任何疑惑可以回复我~ 2018-08-03 08:09:26
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号