- 浏览: 659360 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
HkEndless:
不好意思,请问这确定是回调机制吗。你的例子中只是将接口的实现类 ...
Spring CallBack回调机制介绍 -
hanmiao:
写的真乱啊,完全不知所云...
Java如何调用可执行文件和批处理命令 -
junia_1:
junia_1 写道 shock: ...
为什么要使用EJB -
junia_1:
shock:
为什么要使用EJB -
coollifer:
不错
SQL Server数据导入到Oracle中的方法
文件锁
JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。
注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两次锁定同一文件或某文件里的同一区域,tryLock与lock则会抛出OverlappingFileLockException异常。
要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们是从单进程实体继承而来;一般来说,你是不会让两个进程去共享一个网络socket的。 tryLock( ) 是非阻塞的,它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回;而lock( )是阻塞的,如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它的线程,或者关闭了它要lock()的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。
还可以像这样锁住文件的某一部分
tryLock(long position, long size, boolean shared)
或者
lock(long position, long size, boolean shared)
这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示是否是共享锁。
虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。
锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个共享锁,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。
在写文件时才能锁定,如果对一个只读文件通道进行锁定操作时,会抛NonWritableChannelException异常,即new FileInputStream("data2.txt").getChannel().tryLock();时就会抛异常。
另外锁定写文件通道new FileOutputStream("data2.txt").getChannel().tryLock();时,它会清掉原文件中的内容,所以当文件中有内容时最好使用 new FileOutputStream("data2.txt",true).getChannel().tryLock(); 以追加方式打开写文件通道。或者使用RandomAccessFile类来创建文件通道然后锁定 new RandomAccessFile("data2.txt","rw").getChannel().tryLock(); ,这样它不会破坏锁定的文件的内容。
最后在使用tryLock()获取锁时, 有可能获取不到,这时就会为null,我们需能对此做相应处理。以下是简单的销实例:
Java代码
1. import java.io.FileOutputStream;
2. import java.nio.channels.FileLock;
3.
4. public class FileLocking {
5. public static void main(String[] args) throws Exception {
6. FileOutputStream fos = new FileOutputStream("file.txt");
7. //获取文件锁 FileLock 对象
8. FileLock fl = fos.getChannel().tryLock();
9. //tryLock是尝试获取锁,有可能为空,所以要判断
10. if (fl != null) {
11. System.out.println("Locked File");
12. Thread.sleep(100);
13. fl.release();//释放锁
14. System.out.println("Released Lock");
15. }
16. fos.close();
17. }
18. }
import java.io.FileOutputStream;
import java.nio.channels.FileLock;
public class FileLocking {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("file.txt");
//获取文件锁 FileLock 对象
FileLock fl = fos.getChannel().tryLock();
//tryLock是尝试获取锁,有可能为空,所以要判断
if (fl != null) {
System.out.println("Locked File");
Thread.sleep(100);
fl.release();//释放锁
System.out.println("Released Lock");
}
fos.close();
}
}
锁定映射文件中的部分内容
文件映射通常用于很大的文件,因此我们可能需要对文件操作的部分进行加锁,以便其他进程可以修改文件中未被加锁的部分。
Java代码
1. import java.io.IOException;
2. import java.io.RandomAccessFile;
3. import java.nio.ByteBuffer;
4. import java.nio.MappedByteBuffer;
5. import java.nio.channels.FileChannel;
6. import java.nio.channels.FileLock;
7.
8. public class LockingMappedFiles {
9. static final int LENGTH = 0x200000; // 2 Mb
10. //static final int LENGTH = 100;
11. static FileChannel fc;
12.
13. public static void main(String[] args) throws Exception {
14. //使用可随机访问文件创建可读写文件通道
15. fc = new RandomAccessFile("test.txt", "rw").getChannel();
16. //内存映射可读写文件,并映射至整个文件
17. MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
18. for (int i = 0; i < LENGTH; i++) {//写满2M内容
19. out.put((byte) 'x');
20. }
21. //锁定前1/3内容
22. new LockAndModify(out, 0, 0 + LENGTH / 3);
23. //从文件中间开始锁定1/4内容,注,要锁定的内容一定不能有与
24. //已经锁定的内容,否则抛OverlappingFileLockException
25. new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4);
26. }
27.
28. private static class LockAndModify extends Thread {
29. private ByteBuffer buff;
30. private int start, end;
31.
32. LockAndModify(ByteBuffer mbb, int start, int end) {
33. this.start = start;
34. this.end = end;
35.
36. //调整可最大读写位置
37. mbb.limit(end);
38. //调整读写起始位置
39. mbb.position(start);
40. //创建新的子缓冲区,但与原缓冲是共享同一片数据,
41. //只是缓冲区位置、界限和标记值是相互独立的
42. buff = mbb.slice();
43. start();
44. }
45.
46. public void run() {
47. try {
48. // 获取独占锁,如果要锁定的部分被其他应用程序锁定,则会阻塞,至到获取锁为止
49. FileLock fl = fc.lock(start, end, false);
50. System.out.println("Locked: " + start + " to " + end);
51. System.out.println(buff.position() + " " + buff.limit());
52.
53. // 进行修改操作,前当前位置类
54. while (buff.position() < buff.limit() - 1) {
55. buff.put((byte) (buff.get() + 1));
56. }
57. //JVM退出,或者channel关闭的时候会自动释放这些锁,但是你也可以用FileLock
58. //的release( )方法,明确地释放锁,就像这里释放锁一样
59. fl.release();
60. System.out.println("Released: " + start + " to " + end);
61. } catch (IOException e) {
62. throw new RuntimeException(e);
63. }
64. }
65. }
66. }
JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。
注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两次锁定同一文件或某文件里的同一区域,tryLock与lock则会抛出OverlappingFileLockException异常。
要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们是从单进程实体继承而来;一般来说,你是不会让两个进程去共享一个网络socket的。 tryLock( ) 是非阻塞的,它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回;而lock( )是阻塞的,如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它的线程,或者关闭了它要lock()的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。
还可以像这样锁住文件的某一部分
tryLock(long position, long size, boolean shared)
或者
lock(long position, long size, boolean shared)
这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示是否是共享锁。
虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。
锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个共享锁,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。
在写文件时才能锁定,如果对一个只读文件通道进行锁定操作时,会抛NonWritableChannelException异常,即new FileInputStream("data2.txt").getChannel().tryLock();时就会抛异常。
另外锁定写文件通道new FileOutputStream("data2.txt").getChannel().tryLock();时,它会清掉原文件中的内容,所以当文件中有内容时最好使用 new FileOutputStream("data2.txt",true).getChannel().tryLock(); 以追加方式打开写文件通道。或者使用RandomAccessFile类来创建文件通道然后锁定 new RandomAccessFile("data2.txt","rw").getChannel().tryLock(); ,这样它不会破坏锁定的文件的内容。
最后在使用tryLock()获取锁时, 有可能获取不到,这时就会为null,我们需能对此做相应处理。以下是简单的销实例:
Java代码
1. import java.io.FileOutputStream;
2. import java.nio.channels.FileLock;
3.
4. public class FileLocking {
5. public static void main(String[] args) throws Exception {
6. FileOutputStream fos = new FileOutputStream("file.txt");
7. //获取文件锁 FileLock 对象
8. FileLock fl = fos.getChannel().tryLock();
9. //tryLock是尝试获取锁,有可能为空,所以要判断
10. if (fl != null) {
11. System.out.println("Locked File");
12. Thread.sleep(100);
13. fl.release();//释放锁
14. System.out.println("Released Lock");
15. }
16. fos.close();
17. }
18. }
import java.io.FileOutputStream;
import java.nio.channels.FileLock;
public class FileLocking {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("file.txt");
//获取文件锁 FileLock 对象
FileLock fl = fos.getChannel().tryLock();
//tryLock是尝试获取锁,有可能为空,所以要判断
if (fl != null) {
System.out.println("Locked File");
Thread.sleep(100);
fl.release();//释放锁
System.out.println("Released Lock");
}
fos.close();
}
}
锁定映射文件中的部分内容
文件映射通常用于很大的文件,因此我们可能需要对文件操作的部分进行加锁,以便其他进程可以修改文件中未被加锁的部分。
Java代码
1. import java.io.IOException;
2. import java.io.RandomAccessFile;
3. import java.nio.ByteBuffer;
4. import java.nio.MappedByteBuffer;
5. import java.nio.channels.FileChannel;
6. import java.nio.channels.FileLock;
7.
8. public class LockingMappedFiles {
9. static final int LENGTH = 0x200000; // 2 Mb
10. //static final int LENGTH = 100;
11. static FileChannel fc;
12.
13. public static void main(String[] args) throws Exception {
14. //使用可随机访问文件创建可读写文件通道
15. fc = new RandomAccessFile("test.txt", "rw").getChannel();
16. //内存映射可读写文件,并映射至整个文件
17. MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
18. for (int i = 0; i < LENGTH; i++) {//写满2M内容
19. out.put((byte) 'x');
20. }
21. //锁定前1/3内容
22. new LockAndModify(out, 0, 0 + LENGTH / 3);
23. //从文件中间开始锁定1/4内容,注,要锁定的内容一定不能有与
24. //已经锁定的内容,否则抛OverlappingFileLockException
25. new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4);
26. }
27.
28. private static class LockAndModify extends Thread {
29. private ByteBuffer buff;
30. private int start, end;
31.
32. LockAndModify(ByteBuffer mbb, int start, int end) {
33. this.start = start;
34. this.end = end;
35.
36. //调整可最大读写位置
37. mbb.limit(end);
38. //调整读写起始位置
39. mbb.position(start);
40. //创建新的子缓冲区,但与原缓冲是共享同一片数据,
41. //只是缓冲区位置、界限和标记值是相互独立的
42. buff = mbb.slice();
43. start();
44. }
45.
46. public void run() {
47. try {
48. // 获取独占锁,如果要锁定的部分被其他应用程序锁定,则会阻塞,至到获取锁为止
49. FileLock fl = fc.lock(start, end, false);
50. System.out.println("Locked: " + start + " to " + end);
51. System.out.println(buff.position() + " " + buff.limit());
52.
53. // 进行修改操作,前当前位置类
54. while (buff.position() < buff.limit() - 1) {
55. buff.put((byte) (buff.get() + 1));
56. }
57. //JVM退出,或者channel关闭的时候会自动释放这些锁,但是你也可以用FileLock
58. //的release( )方法,明确地释放锁,就像这里释放锁一样
59. fl.release();
60. System.out.println("Released: " + start + " to " + end);
61. } catch (IOException e) {
62. throw new RuntimeException(e);
63. }
64. }
65. }
66. }
发表评论
-
hibernate Restrictions用法 MatchMode.ANYWHERE
2012-07-14 15:50 3970方法 说明 Res ... -
URLClassLoader
2012-05-27 19:45 999This example shows how a serv ... -
MyClassLoader 自定义类加载器
2012-05-27 19:38 1525package demo; import java. ... -
Deal with big-endian and little-endian order
2011-12-25 19:17 1120Java virtual machine always use ... -
修改eclipse的背景色
2011-11-12 19:23 1115eclipse 操作界面默认颜色为白色。对于我们长期 ... -
多线程管道流输入输出模式
2011-11-07 07:23 1091import java.io.* ; class Send ... -
Java计数单字节双字节字符个数的例子
2011-10-26 14:29 1294/* 计数单双字符的个数并存储在Map对象中 ... -
常用内存数据库3
2011-10-24 00:24 15204.1.2 哪些场合适合使用其他的关系型数据库管 ... -
java字节码规则
2011-09-05 13:56 1254栈和局部变量操作 将常量压入栈的指令 aconst_nul ... -
Tomcat中限制ip访问
2011-08-23 21:40 1272Tomcat中限制ip访问是非常简单的,只需要编辑server ... -
一个Java程序员应该掌握的10项技能
2011-08-22 10:27 6211、语法:必须比较熟 ... -
2011 年 8 月 Java 开发人员新闻快讯
2011-08-18 18:59 837Java SE 7 发布了! 经过世界各地 Ja ... -
BlockingQueue
2011-08-13 09:59 719import java.util.concurrent.Arr ... -
eclipse中java项目转换为web项目
2011-07-27 18:29 898经常在eclipse中导入web项目时,出现转不了项目类型 ... -
Oracle官方Weblogic插件安装
2011-07-20 22:00 2881Installing Oracle Enterprise Pa ... -
Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
2011-06-21 17:44 2322C ollections类中提供了多 ... -
关于java的集合类,以及HashMap中Set的用法
2011-06-21 17:35 1807import java.util.*; public c ... -
Java的动态代理实例
2011-06-16 03:44 1058首先写一个接口: package net.test.dyna ... -
Java如何调用可执行文件和批处理命令
2011-06-07 00:58 2351Java是种跨平台的语言,我们经常碰到需要通过Java调用wi ... -
jsp实现图片验证码的方法
2011-06-07 00:57 1393调用方法 <img src=&quo ...
相关推荐
记录锁允许锁定文件的特定部分,而共享锁和独占锁则是对整个文件进行操作。共享锁允许多个进程同时读取一个文件,但独占锁则要求在写入文件时,其他所有进程都不能持有该文件的锁。 文件锁的实现通常涉及以下API: ...
2. **锁定区域**:`FileLock`允许你锁定文件的特定区域,而不是整个文件。这可以通过`channel.lock(start, end, shared)`方法实现,其中`start`和`end`定义了锁定的字节范围,`shared`参数指定是共享锁(true)还是...
除了基本的文件锁定功能,`filelock`还支持软锁和硬锁两种类型。软锁在操作系统层面不保证跨进程的互斥,但可以在同一台机器上的不同Python进程之间工作。硬锁则提供了更强的保证,可以防止其他进程(甚至跨系统)...
强大的文件删除工具,当你删除文件时,可能遇到文件无法删除,这时候,filelock就可以轻松帮助你解决文件。
5. **文件锁定类型**:`filelock`库支持两种类型的文件锁:独占锁(exclusive lock,也称为写锁)和共享锁(shared lock,也称为读锁)。独占锁只允许一个进程访问文件,而共享锁允许多个进程同时读取但不允许写入。...
`FileLock`是Java提供的一种机制,允许我们锁定一个文件或文件的一部分,从而在多个进程之间实现互斥访问。这个压缩包“使用FileLock实现进程的互斥.rar”可能包含了一些示例代码,帮助开发者理解如何在Java中使用`...
CnCrypt FileLock添加文件或目录后,创建自定义保护规则。能够提供隐藏、锁定、隐藏并锁定三种保护模式,可添加例外进程。保护你的文件、文件夹不被别人轻易打开、阅读、修改、删除、移动、复制,甚至你可以设置让...
`FileLock`是Java NIO(非阻塞I/O)的一部分,它允许程序锁定一个文件或者文件的部分区域,以防止其他进程同时读写该文件。这种方式特别适用于需要在多个进程中保持数据一致性的场景,例如日志记录、配置文件管理等...
如果是读锁,且文件已被写锁锁定,也会阻塞。 4. 在完成文件操作后,使用`fcntl()`的`F_UNLCK`标志释放锁。 5. 关闭文件描述符。 需要注意的是,文件锁是基于文件系统的,这意味着如果进程通过网络访问同一个文件,...
在 Java 中,可以使用 FileLock 类来实现文件锁。下面将详细介绍 Java 文件锁的简单实现。 什么是文件锁 文件锁是一种机制,它允许程序控制文件的访问和修改,以确保文件的安全性和一致性。当多个程序同时访问同一...
文件锁 便携式文件锁定 在文件上放置排他或共享锁。 它在Windows上使用LockFile ,在类似Unix的系统上使用fcntl锁。 安装 照常从CRAN安装软件包: install.packages( " filelock " ) 用法 library( filelock ) 这...
我昨天刚开始用的加密软件,可以一次加密多个文件。如果想加密文件夹的话可以先将其打包。用过后感觉不错的。软件不需安装,但需要点击“绿化”。安装时请查看解压目录上的说明。加密器的初始密码是123456,绿化后请...
Java NIO(New Input/Output)...5. 文件锁:利用FileLock实现文件的同步控制,保证并发环境下的数据安全。 对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。
文件锁是共享的,意味着同一文件可以被多个读取者同时锁定,但只能被一个写入者锁定。这确保了在并发环境中数据的一致性。以下是一个简单的文件锁定示例: ```java try (FileChannel channel = FileChannel.open...
文件锁功能通常包括以下组件: 1. 密钥管理:创建、存储和管理用于加密的密钥,确保只有授权用户能访问。 2. 加密/解密引擎:实现加密算法,对文件内容进行处理。 3. 用户接口:提供友好的图形用户界面(GUI),...
在编程中,如Python的`filecntl`模块,Java的`FileLock`类,提供了文件锁定的支持。 5. **查看文件锁**:要查看一个文件被谁加锁,通常需要使用特定的工具或命令。在Unix/Linux系统中,可以使用`lsof`(列出打开文件...
而“FileLock.exe”可能是该软件的一部分,专门负责文件的锁定功能。安装“giliflp410.exe”后,用户应能通过软件界面选择需要保护的文件,设置访问权限,以及选择是否应用加密。例如,用户可能能够设定密码,只有...
3. **文件内容保护**:在业务逻辑中,文件锁可以用来保护敏感文件不被意外修改。 以下是一个使用flock()和swoole_lock()的文件锁示例: ```php // 使用flock() $o_file = fopen("locktest.txt", 'w+'); flock($o_...
`FileStream`类提供了`Lock`和`Unlock`方法来锁定和解锁文件的特定部分。例如: ```csharp long position = 0; long length = 1024; // 假设我们要锁定的第一个字节到第1024个字节 fs.Lock(position, length); ...
离线安装包,亲测可用