请问:不同线程中的流指向同一个文件,并对这个文件进行写操作,但写的位置不会相互覆盖,是否会有访问冲突?
谢谢了!

解决方案 »

  1.   

    回二楼:多个线程共用一个流正是我现在的策略,但是会有一个问题,流是要关闭以后才把内容写到文件内的,而我的主线程是一个while(true)循环,也就是说主线程永远不会退出,而全局流是主线程内的一个变量,我现在的办法是每隔一段时间对该全局流进行一次关闭操作(每30秒对文件进行一次更新,以便能看到最新的文件内容),但是,如果在关闭之后,重新打开之前(虽然这个时间段非常短),正好某个线程调用了该流来写文件,就会出错,这样程序就变得不可预期了(不知道什么时候会出错)。
    回三、四楼:如果使用同步,某些线程会执行一些很耗时的操作(但不是写文件操作),有的时候甚至是几个小时,如果这些线程占用这个文件一直不释放,就会极大的影响程序性能,违背了我使用多线程的初衷。 
      

  2.   

    三楼:“但是线程的行为却是无法预期的”——我不对文件进行读操作,只是写,而且是以append的方式,追加到文件末尾,不存在脏读的问题,如果可以同时访问的话,顶多只是输出的内容顺序有些错乱。
      

  3.   

    回lixkyx:其实我程序的主要功能已经实现了,当然主要功能不是用来写文件(而是用来处理那个耗时的操作以提高性能),写文件只是实现日志记录,如您所言,如果没有更好的实现办法,那我就干脆放弃日志,使用控制台输出好了。只是这样就无法查询过往的执行记录了。
      

  4.   

    ADemon_T的方法可行,我周一去试一下。
    另外我想到一个方法,大家看是否可行:
    建立一个控件,将所有输出都显示在控件内,然后定期保存控件内的内容。
    思想和ADemon_T很类似。
      

  5.   

    不知道RandomAccessFile行不行的通啊!当然,同步控制是少不了的!
      

  6.   

    根据我的测试,多个线程是允许写同一个文件的。参考这个
    HTTP多线程,端口侦听和服务的完整程序实现的是一个多线程下载的代码。
      

  7.   

    ThreadLocal  昨天刚看过这个介绍,本人认为用这个应该可以吧
      

  8.   

    操作系统中的信号量啊,别用多线程共享一个流,这样很容易混乱
    轮到这个线程就打开文件,读或者写,关闭文件
    这三个操作封装起来做成原子的
    几个线程共享一个静态int常量做锁
      

  9.   

    回sunxyz86:很好的方法!谢谢!
      

  10.   

    "流是要关闭以后才把内容写到文件内的"? flush()一下不就写进去了吗?
      

  11.   

    "回lixkyx:其实我程序的主要功能已经实现了,当然主要功能不是用来写文件(而是用来处理那个耗时的操作以提高性能),写文件只是实现日志记录,如您所言,如果没有更好的实现办法,那我就干脆放弃日志,使用控制台输出好了。只是这样就无法查询过往的执行记录了。"如果你使用后台线程的目的只是为了写日志,那反而简单了。因为日志可以定期来写,不需要随时运行,你完全可以定义一个平时阻塞,定时运行(或者紧随其他线程完成文件操作之后运行),从而实现你要的功能。通常Office里的自动保存功能就是通过这样的后台线程实现的。
      

  12.   

    将文件分割成BYTE流---分成N份start《first part》#1   
    #1  《second part》#2
    ....
    #n  《second part》#end最后将特殊字符消除即可。所以迅雷的文件在下载的时候预存大小就是文件大小。甚至比这个大。
      

  13.   

    线程对临界资源的访问要通过同步来控制,也就是对资源实现锁控制或是synchozied进行控制
      

  14.   

    我刚写了一个 你可以试试看  RandomAccessFile rfile=null;
    FileChannel f =null;
    while(true)
    {
    try{
    rfile=new RandomAccessFile(WriteBasePath,"rw"); 
    f  = rfile.getChannel();
    if(f != null)
    break;
    else
    Thread.sleep(1*100);
    }catch(java.io.FileNotFoundException e)
    {

    }

    }
    while(true)
    {
    try{

    if(f.tryLock().isValid())
    break;
    else
    Thread.sleep(1*100);
    }catch(OverlappingFileLockException e)
    {


    }
    long fileLength = rfile.length();  
    rfile.seek(fileLength);
    rfile.writeBytes(Info+"\r\n");
    rfile.close();