多线程并发思考--文件加锁

本文探讨了在多线程环境中遇到的文件读写冲突问题,通过实验发现单纯使用`synchronized`关键字无法有效防止。作者转向使用Java NIO的`FileChannel`进行文件加锁来确保线程安全,但在不同操作系统下效果不一。文章期望能有更优解决方案,以判断文件是否被占用。
摘要由CSDN通过智能技术生成

多线程并发思考--文件加锁

         在最近的工作中,经常要用到线程,就对线程相关知识稍微看了看,知道并发线程经常引起共享资源冲突,java以提供关键字synchronized的形式,为防止资源冲突提供了内置支持.

         可是在工作中,我却碰到了这样的需求,定时抛出线程读写某文件的内容,由于相隔时间很短,我突然想到,会不会在第二次轮循开始对该文件进行读操作的时候,第一次抛出的线程还在对该文件进行写操作,如果有可能,那么第二次读出的数据会是什么样的呢?

        怀着这样的疑问,我开始以程序作实验,代码如下:

1.用于写文件的线程

package  chb.thread;

import  java.io.BufferedWriter;
import  java.io.File;
import  java.io.FileWriter;
import  java.io.IOException;
import  java.util.Calendar;

/**
 * 
@author 崔红保
 *  
 *  这个线程用于写文件
 
*/

public   class  Thread_writeFile  extends  Thread {
    
public void run(){
        Calendar calstart
=Calendar.getInstance();
        File file
=new File("D:/test.txt");    
        
try {
            
if(!file.exists())
                file.createNewFile();
            FileWriter fw
=new FileWriter(file);
            BufferedWriter bw
=new BufferedWriter(fw);
            
for(int i=0;i<1000;i++){
                sleep(
10);
                bw.write(
"这是第"+(i+1)+"行,应该没错哈 ");
            }

            bw.close();
            bw
=null;
            fw.close();
            fw
=null;
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (InterruptedException e) {
            e.printStackTrace();
        }

        Calendar calend
=Calendar.getInstance();
        System.out.println(
"写文件共用了"+(calend.getTimeInMillis()-calstart.getTimeInMillis())+"毫秒");
    }


}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值