java控制多线程同时写⼀个⽂件
⼀、缘起
最近出现⼀个需求,⼤体要做的就是控制多线程同时操作⼀个⽂件。当时第⼀个反应是不要⽤synchronized,太low了,然后我就使⽤了读写锁ReentrantReadWriteLock,然后写完静下来和业务结合在⼀起分析⼀下,结果尴尬了。因为⽂件名可能是别的线程刚刚⽣成的带上了时间戳,线程A 写orders_201904171130.xls⽂件,线程B写orders_201904171131.xls⽂件,这个时候实际上时不能阻塞的。Lock没办法像synchronized关键字⼀样,给定⼀把锁,锁住特定的对象。锁对象不同,则不阻塞
然后试着使⽤synchronized代码块,使⽤filename作为锁对象,初⼀看好像可以,但是经不住测试哇,测试的时候即使同⼀个⽂件名,还是不能阻塞,因为filename是属于拼接起来的,且还是局部变量,所以这个filename的string虽然在常量池中值是⼀样的,但是在堆⾥的对象地址是不⼀样的,所以synchronized肯定认为不是同⼀个对象锁,所以同⼀个⽂件名并没有阻塞
然后想起来使⽤RandomAccessFile和FileLock实现,但是我这种情况下是往远程服务器共享⽬录读写,File类是⽤不了的。所以他也⽤不了。
⼆、使⽤synchronized实现
字符串常量池存放的是引用还是对象如上述所说,⽂件名属于拼接的,虽然是指向同⼀个常量,但是String的堆地址变化了,所以采⽤intern()⽅法可以做到。api表⽰:⼀个与该字符串具有相同内容的字符串,但保证来⾃⼀个唯⼀字符串池。。它的返回值:⼀个字符串,内容与此字符串相同,但⼀定取⾃具有唯⼀字符串的池。
⾄于写⽂件的代码就不贴了,⼤致就是在写的部分使⽤synchronized代码块,对象锁直接使⽤intern()⽅法返回的filename
三、使⽤RandomAccessFile和FileLock相结合
附上RandomAccessFile和FileLock实现处理多⼈同时读写⽂件的参考连接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论