当前位置: 首页 > 面试题库 >

Java:线程安全的RandomAccessFile

曾山
2023-03-14
问题内容

经过一番认真的搜索后,我发现RandomAccessFile-
class不是线程安全的。现在,我可以使用一个信号量来锁定所有读取和写入,但是我认为这样做的效果不是很好。从理论上讲,一次可以进行多次读取和一次写入。如何用Java做到这一点?有可能吗?

谢谢!


问题答案:

文件的部分锁定是一项复杂的业务,许多操作系统都避免这样做。但是,如果您坚持要这样做,一种方法是设计自己的锁定机制对象,该对象记录文件的哪些部分被锁定。本质上,在读取或写入对象之前,必须请求锁定文件的特定字节范围。如果锁在字节范围内完全重叠,则视为冲突。读取和写入锁的处理方式有所不同:读取可以与任意数量的读取锁安全地重叠,但是写入锁必须与其他锁(读取或写入)不重叠。关于是否无法获得锁定是等待还是中止,以及在写入等待期间是否阻止读取有很多问题,但是只有您才能回答有关应用程序的问题。

考虑到这样做的复杂性,最好锁定整个文件。检查您是否获得了足够的性能-并且不要忘记,只要没有写入,就可以一次允许多次读取。



 类似资料:
  • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

  • 问题内容: 我需要一个线程安全映射,我有类似这样的内容:(我对Java很陌生) 问题答案:

  • 问题内容: 我有一个函数,该函数使用和来搜索字符串列表中的模式。 此函数用于多个线程。每个线程将在创建线程时传递给的唯一模式。线程和模式的数量是动态的,这意味着我可以在配置期间添加更多s和线程。 如果使用正则表达式,是否需要在此函数上放一个?Java线程中的正则表达式安全吗? 问题答案: 是的 ,来自Pattern类的Java API文档 此类(模式)的实例是不可变的,可以安全地由多个并发线程使用

  • 问题内容: 我有两个线程。第一个在循环中使用MulticastSocket发送数据报;第二个线程在循环中使用相同的MulticastSocket实例接收数据报。 它似乎工作正常,但我仍然对此表示怀疑。 这两个线程可以使用同一MulticastSocket实例吗?在发送/接收方法调用方面,MulticastSocket线程安全吗? 问题答案: 发送和接收DatagramSocket方法都在发送/接收

  • 我正在修改一个Java服务器软件。整个应用程序是单线程的。我的一个更改需要很多时间,所以我决定异步执行,以避免冻结主线程。 问题是:这种锁在Java中的最佳实现是什么?例如,我是否应该使用亲自完成。 编辑:看看我当前实现的答案。

  • 问题内容: 有关Singletons的维基百科文章提到了一些用线程安全的方法来用Java实现结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被多个线程访问的Singleton。 首先,这个未提及的方法是线程安全的吗?如果是的话,它在什么上进行同步? 其次,为什么以下实现线程安全且在初始化时是懒惰的?如果两个线程同时进入该方法,到底会发生什么? 最后,在第二个示例中,如果一个线程首先获取一