0 0

读写文件需要同步或者上锁之类的吗?0

看下面的代码.
CommonUtil包含读文件的写文件的方法:
package demo2;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class CommonUtil {
	
	public static void readFile() throws Exception{
		InputStream is = new FileInputStream("D://abc.txt");
		BufferedInputStream br = new BufferedInputStream(is);
		byte b[] = new byte[26];
		br.read(b);
		System.out.println(new String(b));
		br.close();
		is.close();
	}
	
	public static void writeFile() throws Exception{
		OutputStream is = new FileOutputStream(new File("D://abc.txt"));
		BufferedOutputStream bo = new BufferedOutputStream(is);
		String s = "abcdefghijklmnopqrstuvwxyz";
		bo.write(s.getBytes());
		bo.close();
		is.close();
	}
	
	/*public static void main(String[] args) throws Exception{
		writeFile();
		readFile();
	}*/
	
}

WriteThread是一个写的线程:
package demo2;

public class WriteThread extends Thread{

	public void run(){
		while(true){
			try {
				CommonUtil.writeFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

readThread是一个读的线程:
package demo2;

public class ReadThread extends Thread{

	public void run(){
		while(true){
			try {
				CommonUtil.readFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

测试代码:
package demo2;

public class Test {
	public static void main(String[] args) {
		WriteThread w = new WriteThread();
		ReadThread r = new ReadThread();
		w.start();
		r.start();
	}
}


从结果来看,似乎一边写,一边读,没什么问题啊,每次读到的都是完整的数据,可是我听别人老是说读写要同步、加锁之类的,不然读的内容是不完整之类的。可是这里未发生这种不一致情况,难道代码写的不对,求大家解惑,是怎么回事啊?
2013年9月05日 13:59

3个答案 按时间排序 按投票排序

0 0

单纯对于你这个问题,其实是需要的,比如说,你这两个线程同时对一个数据进行操作,注意是同时,就是说在同一时刻,不分先后的。假设这个数据是1,读线程要对这个数据进行读取,写线程又想要把这个数据修改为2,假如此时不加锁,你说哪个线程会执行成功?说不准的,最后这个数据可能是1,可能是2,也可能是其他值。所以此时就需要加锁了。关于同步,是指一个事件的执行时需要另一事件的结果,那此时这两个事件就需要同步。说了这么一大堆,不知道你能不能懂?如果不懂,可以再找些资料具体看一下,不过还是希望对你有点用处。

2013年9月07日 17:32
0 0

一个写一个读,当然没问题了。因为没写进去的话,也读不出来。多个写线程的时候就不行了

2013年9月06日 16:59
0 0

是为了防止多线程操作同一个文件

2013年9月05日 16:05

相关推荐

    操作系统课程大作业-文件管理系统

    C++的`fstream`库提供了`ifstream`(用于读取文件)、`ofstream`(用于写入文件)和`fstream`(同时进行读写)类,这些类允许我们与磁盘上的文件进行交互。例如,我们可以使用`open()`函数打开一个文件,`read()`和`...

    Linux内核数据同步经典方法

    在Linux内核中,有几种经典的数据同步方法,主要包括互斥锁(Mutex)、读写锁(Read-Write Lock)、顺序锁(Seqlock)、信号量(Semaphore)、自旋锁(Spinlock)和RCU(Read-Copy Update)等。 1. 互斥锁(Mutex)...

    C++ 使用CMutex 类实现线程同步

    本主题将深入探讨如何使用`CMutex`类来实现线程同步,该类是Microsoft MFC(Microsoft Foundation Classes)库中的一个组件,专门用于处理线程间的互斥访问。 首先,线程同步是为了防止多个线程同时访问同一资源,...

    实现unix虚拟文件系统

    Unix VFS是操作系统内核中的一个抽象层,它屏蔽了底层文件系统的差异,使得用户和应用程序无需关心具体文件存储在哪个设备或者何种类型的文件系统上。VFS的核心在于其挂载(mount)机制,允许用户将不同的文件系统...

    Java资源同步Java资源同步Java资源同步

    虽然没有给出具体的代码,但从文件路径可以推测出这些类可能涉及到了资源同步相关的逻辑。例如,`NSReleaseLib`可能是用于处理同步逻辑的库,而`PageInfoBean`则可能包含了需要被同步的页面信息等数据。 #### 5. ...

    操作系统实验 文件管理

    1. **文件的创建**:当用户需要保存数据时,操作系统会为该数据分配一个唯一的标识(文件名),并为之在磁盘上分配存储空间。在这个实验中,我们需要理解如何使用C++的文件流库(fstream)来创建一个新的文件。 2. ...

    linux ext2 文件系统模拟 c语言实现

    Linux的EXT2(第二扩展文件系统)是早期广泛使用的文件系统之一,特别是在嵌入式系统和Linux服务器上。EXT2的C语言实现是一项技术性极强的任务,涉及到对操作系统底层机制的理解,包括文件系统的结构、inode、超级块...

    并行文件系统调研报告

    - **解决方案**:一种常见做法是在并行文件系统之上增加一个可以捕获并行程序数据访问模式的层——并行I/O库,以优化I/O请求的处理。 #### 三、并行文件系统的分类 - **商业用途的并行文件系统**:专为商业环境...

    java进阶提高学习教程-14锁机制.pptx

    AQS 是队列同步器 AbstractQueuedSynchronizer 的简写,用来构建锁或者其他同步的基础。AQS 使用一个 int 成员变量来表示同步状态,通过内置 FIFO 队列完成竞争资源的线程排队工作。AQS 提供方法主要有三类:独占式...

    IOS线程管理,线程同步

    6. **队列同步(Queue Synchronization)**:通过在同一线程队列上提交任务实现同步,例如,主线程上的任务会按顺序执行,无需额外的同步措施。 了解了这些基础知识后,开发者可以根据实际需求选择合适的线程管理...

    java同步、异步相关知识点

    `synchronized`关键字是最常用的同步机制之一。它可以用来修饰方法或者代码块,确保同一时刻只有一个线程能够访问被修饰的资源。 - **修饰方法**:当`synchronized`用于修饰一个实例方法时,该锁的范围是整个对象;...

    典型分布式文件系统概述(一)

    - **同步机制**:依赖于锁管理器来协调多个客户端对同一文件的访问。 - **缓存和复制**:客户端可以缓存文件副本以减少网络通信。 - **容错性**:通过重试机制和冗余服务器提高系统的可靠性。 - **安全性**:...

    Java同步线程模型分析与改进研究.pdf

    或者使用并发集合来替代传统的集合类,这样可以在多线程环境下实现更好的性能。 在实际操作中,Java同步线程模型的应用需要特别注意线程的创建和管理。合理设置系统进程数目、控制上下文切换次数以及线程的合理分工...

    缓存和分布式锁.pdf

    整合步骤包括配置pom文件引入Redis依赖、配置application.yml文件指定Redis服务器地址及端口、通过RedisAutoConfiguration自动配置类进行配置,并利用RedisTemplate或StringRedisTemplate封装Redis操作。 整合Redis...

    UNIX同步和多处理器

    - **更高级的同步原语**:现代多处理器系统采用了更复杂的同步原语,如信号量、读写锁等,以实现更精细的控制和更高的效率。 - **锁管理和死锁避免**:锁的管理、锁粒度的选择以及如何避免死锁等问题成为设计多...

    one lock.zip

    如果其中包含源代码或者文档,我们可以深入研究其使用了哪种锁机制,是如何实现线程同步的,以及在处理并发问题时有哪些独特之处。同时,如果涉及到其他编程概念或技术,例如死锁预防、线程池管理、异步编程等,都是...

    数据存储之IO

    在源码层面,我们可能会看到诸如C++的iostream库或者Java的java.io包,它们提供了各种IO流类用于处理文件、网络等IO操作。例如,`std::ifstream`用于读取文件,`std::ofstream`用于写入文件,而在Java中,`...

Global site tag (gtag.js) - Google Analytics