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实现处理多人同时读写文件的参考连接:
https://blog.csdn.net/gxy3509394/article/details/7435993
java控制多线程同时写一个文件的更多相关文章
- 在java程序当中怎么获取一个文件的路径
在java程序当中怎么获取一个文件的路径? * 当这个文件在类路径下的时候(在src/bin目录下的时候): String absolutePath = Thread.currentThread(). ...
- 使用Java的多线程和IO流写一个文件复制功能类
创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...
- python利用socket写一个文件上传
1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中 2.代码: #模拟服务端 import subprocess import os import sock ...
- java中jar命令打包一个文件夹下的所有文件
(1)首先,必须保证java的所有路径都设置好,在dos提示符下输入jar -help出现C:\Documents and Settings\dly>jar -help非法选项:h用法:jar ...
- ruby写一个文件内容相似性比较的代码
1.相似度定义 我们定义,则,我们设,则,|C|=s,则相似度p=,p(0,1) 2.相似度检测算法设计 算法设计: 定义4个字符为一个字符串,将T1,T2分割成若干字符串,若剩余字符不足4个,则以空 ...
- Java控制多线程执行顺序
package net.jasonjiang.thread; import java.io.IOException; public class ThreadTestNew { public stati ...
- php如何解决多线程同时读写一个文件的问题
<?php header("content-type:text/html;charset=utf-8"); $fp = fopen("lock.txt", ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- 简化日常工作之三:自己写一个CI脚手架
程序员是诗人,应该写一些有思想意义的code,而不是每天重复造轮子,写一些低成本的业务逻辑. ---------------------------------一个脚本仔的心声 由于目前公司使用CI框 ...
随机推荐
- js实现分段上传文件
使用js实现分段上传文件,本文使用了FileReader对象,可参考:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 1)获取文 ...
- ZooKeeper 之快速入门
-----------------破镜重圆,坚持不懈! 1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务 ...
- Jsp监听器
监听器: 监听器就是对内置对象的状态或者属性变化进行监听,并且做出反应的特殊的servlet,在web.xml文件中对监听器进行的配置. 内置对象有两种状态变化:产生.销毁,就是当产生内置对象的时候能 ...
- Infiniband 网络性能测试
1.带宽测试 在server端执行 [ibtests]# ib_send_bw -a -c UD -d mlx4_0 -i 1 ---------------------------------- ...
- quotes 整站数据爬取存mongo
安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...
- python3基本数据类型
python3的基本数据类型: Number(数字).String(字符串).List(列表).Tuple(元组).Set(集合).Dictionary(字典) 不可变数据类型(3 个):Number ...
- <Android基础> (七)内容提供器
第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...
- flutter - 01 基础介绍以及ListView
这篇主要讲flutter最基本的操作.我们从一个实例入手,先不需要知道它里面的每一行是什么意思,我会慢慢说. main.dart import 'package:flutter/material.da ...
- mysql常用的用户授权语句
一:授权主要的 SQL //某个数据库所有的权限 ALL 后面+ PRIVILEGES GRANT ALL PRIVILEGES ON 库名.* TO '用户'@'%' IDENTIFIED BY ' ...
- ansible Templates
Files和templates files和templates均用于ansible文件处理,两者的主要区别是:Files目录下的文件无需写绝对路径即可将文件传输到远程主机,templates目录下文件 ...