java并发读&写文件
来源:互联网 发布:金蝶软件数据导出 编辑:程序博客网 时间:2024/05/01 08:40
最近在看Brian Goetz 的<<Java并发实战>>,这本书有两个版本,电子工业出版社的译本很糟糕,建议使用机械工业出版社出版出版的书籍.
在看到第三四章的时候突然想到了多线程读写文件,同时遇到一些书中没有的问题
1, 如何保证组合对象的安全性?
2, 如何判断不变性的约束条件
3, 如何不通过synchronized关键字和锁进行同步处理?
下面是一段代码, 用来从source 读取数据,通过多线程写入target文件中
思路:
1, 如何read/write文件?
2, 如何设计Reader类?
3, Reader类的是否需要状态来描述? 状态变量如何同步?
4, 如何保证当前Thread可以准确地读取当前segment?
代码综述:
解决方式:
1, 多线程读取文件需要从不同的地方读取数据,所以普通的stream不符合要求,所以选择java.io.RandomAccessFile 它可任意设置文件cursor.并且包含read&write方式
2, ①reader&writer设计
多线程执行的是reader类的run方法,所以每个线程都必须有自己独立的reader&writer,所以reader&writer必须是线 程私有的,也就是说需要把reader&writer封装在线程中,线程之间的reader&writer不能共享.
②如何处理source&target?
每个线程处理自己所负责的块,最终的块合在一起就是一个完整的target.
也就是将source分为大小为segment length的segment块,但是注意,最后一个segment块的实际有效数据长度并非 segment length.
③其他域设计
需要两个File来描述source&target
需要两个变量描述source被分成多少个segments以及segment的大小segmentLength
需要一个变量描述最后一块remain的大小
需要一个共享变量segment来描述source文件的文件状态
3, source文件需要一个segment变量来描述它被多线程处理的状态,也就是当前线程处理到哪里了.还有那些尚未处理
4,Thread读取过的segment可以使用一个java.util.concurrent.atomic.AtomicLong类型的变量来描述它(也就是主要描述了当前块是第几个块), AtomicLong类的增/减操作是线程安全的.所以每一次读取的块的位置都是安全的
0 0
- java并发读&写文件
- java写文件中并发和乱码问题解决
- Java并发之读/写锁
- java 读文件写文件
- java 读文件 写文件
- java读文件写文件
- 写文件的并发问题
- Java并发系列-19、Java中的读/写锁
- java读、写txt文件
- JAVA读、写EXCEL文件
- 多线程并发写文件-文件锁
- Java读文件写文件操作
- Java IO读文件和写文件
- Java读文件写文件操作
- JAVA读文件写文件---字节流
- Java读文件写文件操作
- Java的读文件和写文件
- Java解决读文件、写文件乱码
- HTMl5的sessionStorage和localStorage
- JAVA的反射机制
- Runtime 的一些用法
- Dalvik虚拟机为新创建对象分配内存的过程分析
- 求序列中只出现一次的元素
- java并发读&写文件
- Android多媒体播放器源码解析(stagefright框架)
- Java 中Vector、ArrayList和LinkedList 的区别
- Visual Studio 的生成事件 (vs2010,vs2012,vs2013,vs2015)
- 单片机系统上电后没有正常运行,如何进行故障排查?
- cocos2dx怎么在android studio 运行
- js获取服务器空间值 c# asp
- 如何配置DSI时钟频率
- [FAQ18316]增大minidump地址范围