导航:首页 > 编程语言 > java方法加锁

java方法加锁

发布时间:2025-01-02 08:20:48

1. java中文件加锁机制是怎么实现的。

Java中文件加锁机制如下:
在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:
第一种方法:使用RandomAccessFile类操作文件。
在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:
RandomAccessFile raf = new RandomAccessFile(file, "rws");
其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁。这种方式打开的文件,就是独占方式的。

第二种方法:使用sun.nio.FileChannel对文件进行加锁。
代码:
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
FileChannel fc = raf.getChannel();
FileLock fl = fc.tryLock();
if(fl.isValid())
System.out.println("You have got the file lock.");

以上是通过RandomAccessFile来获得文件锁的,方法如下:
代码:
FileOutputStream fos = new FileOutputStream("file.txt");
FileChannel fc = fos.getChannel(); //获取FileChannel对象
FileLock fl = fc.tryLock(); //or fc.lock();
if(null != fl)
System.out.println("You have got file lock.");
//TODO write content to file
//TODO write end, should release this lock
fl.release(); //释放文件锁
fos.close; //关闭文件写操作

如果在读文件操作的时候,对文件进行加锁,操作过程如下:
FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去操作FileLock会报异常NonWritableChannelException,需要自己去实现getChannel方法,代码如下:
private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {
FileChannel channel = null;
synchronized(fin){
channel = FileChannelImpl.open(fd, true, true, fin);
return channel;
}
}

其实,看FileInputStream时,发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了。缺省的getChannel方法,就是false,因此,不能锁住文件。

2. java是不是同步方法会自动加this锁,静态同步代码(名字可能不对)会自动加“名.class”锁

//看注释!
classTestLock
{
//非静态方法,默认锁是this
synchronizedvoidshow1()
{

}
//非静态方法,如果方法没有锁,里面同步代码块!
voidshow2()
{
//这里可以填写this,填什么都可以,只要是唯一,对象,类,都可以!
synchronized(this)
{
//这个同步代码块,如果不和上面方法进行同锁,填什么都可以,包括class文件都可以
//但是为了和上面方法同步的话,就必须this了,因为方法的锁此刻默认就是this!
}
} //静态方法看这里!
staticsynchronizedvoidmethod1()
{
//注意这个同步方法的锁,这会默认就不在是this了,而是(TestLock.class)了;
}
//静态同步代码块!
staticvoidmethod2()
{
synchronized(TestLock.class)
{
//这里建议这么写,该方法所属的class文件,当然,写其他类的字节码文件也是可以的!
//但是这里绝对不可以this
//如果和该上买呢静态方法同步的话,必须TestLock.class
}
}
}

阅读全文

与java方法加锁相关的资料

热点内容
有溯源码一定保真吗 浏览:997
云服务器建设方案 浏览:986
jquery源码讲解 浏览:280
宝马app如何发帖 浏览:861
重庆服务器托管商云空间 浏览:439
浦发银行app如何调流水 浏览:677
玉石鉴赏pdf 浏览:842
为什么小度APP一直连不上网络 浏览:163
pdf模板java 浏览:40
现代瑞纳的压缩比 浏览:128
网吧里的ftp服务器有什么用 浏览:872
程序员年终总结工作体会 浏览:153
pdf可以直接打印 浏览:661
android刷wp8 浏览:912
历史地图集pdf 浏览:926
快手app极速版怎么扫码 浏览:805
qq程序员玩法 浏览:96
1是什么门电路app 浏览:867
博之轮运动手表用什么app 浏览:646
asp视频聊天源码 浏览:85