免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5571 | 回复: 3
打印 上一主题 下一主题

多个线程同时访问同一个文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-24 23:25 |只看该作者 |倒序浏览
在java nio 这本书上看到下面一句:
“更妙的是,多个线程可以并发访问同一个文件而不会相互产生干扰。这是因为每次调用都是原子性的(atomic),并不依靠调用之间系统所记住的状态”

所以我就写了下面的程序

  1. /**
  2. * $Id$
  3. * Copyright(C) 2010-2016 bellszhu.com. All rights reserved.
  4. */
  5. package bells.nio.channel;

  6. import java.io.IOException;
  7. import java.io.RandomAccessFile;

  8. /**
  9. * @author <a href="mailto:bellszhu@gmail.com">bellszhu</a>
  10. * @version 1.0
  11. * @since 1.0
  12. * @date: Oct 24, 2012 @time: 10:05:10 PM
  13. */
  14. public class TestMultiAccessFile {

  15.         /**
  16.          * @param args
  17.          */
  18.         public static void main(String[] args) throws IOException {
  19.                 RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
  20.                 String needWriteStr1 = "zzzzzz";
  21.                 String needWriteStr2 = "bbbbbb";

  22.                 Thread t1 = new Thread(new AccessFile(raf, needWriteStr1), "Thread1");
  23.                 Thread t2 = new Thread(new AccessFile(raf, needWriteStr2), "Trhead2");

  24.                 t1.start();
  25.                 t2.start();

  26.         }

  27. }

  28. class AccessFile implements Runnable {

  29.         RandomAccessFile raf;
  30.         String needWriteStr;

  31.         public AccessFile(RandomAccessFile raf, String needWriteStr) {
  32.                 this.raf = raf;
  33.                 this.needWriteStr = needWriteStr;
  34.         }

  35.         @Override
  36.         public void run() {
  37.                 try {
  38.                         for (int i = 0; i < needWriteStr.length(); i++) {
  39.                                 char c = needWriteStr.charAt(i);
  40.                                 raf.writeChar(c);
  41.                                 System.out.println(Thread.currentThread().getName() + "--->: " + raf.getFilePointer());
  42.                         }
  43.                 } catch (IOException e) {
  44.                         e.printStackTrace();
  45.                 }
  46.         }
  47. }
复制代码
上面这个程序大部分时候输出类似:
  1. Thread1--->: 2
  2. Thread1--->: 4
  3. Thread1--->: 6
  4. Thread1--->: 8
  5. Thread1--->: 10
  6. Thread1--->: 12
  7. Trhead2--->: 14
  8. Trhead2--->: 16
  9. Trhead2--->: 18
  10. Trhead2--->: 20
  11. Trhead2--->: 22
  12. Trhead2--->: 24
复制代码
但是有时候会输出类似:

  1. Thread1--->: 3
  2. Trhead2--->: 3
  3. Thread1--->: 5
  4. Thread1--->: 9
  5. Trhead2--->: 7
  6. Trhead2--->: 13
  7. Trhead2--->: 15
  8. Trhead2--->: 17
  9. Trhead2--->: 19
  10. Thread1--->: 19
  11. Thread1--->: 21
  12. Thread1--->: 23
复制代码
因为char是占2个字节的,,所以不太明白为什么会输出下面这类输出??

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
2 [报告]
发表于 2012-10-25 10:43 |只看该作者
求file api文档

论坛徽章:
0
3 [报告]
发表于 2012-10-25 13:59 |只看该作者
回复 2# action08
??什么意思??


   

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
4 [报告]
发表于 2012-10-25 14:11 |只看该作者
atomic file api这库是官方的吗??{:3_198:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP