导航:首页 > 编程语言 > 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方法加锁相关的资料

热点内容
luac编辑后还需要加密吗 浏览:645
解压小动画吃披萨和芬达 浏览:565
王者荣耀怎么互转安卓 浏览:704
php获取股票信息 浏览:150
java文件名和类名不一样怎么编译 浏览:622
优盘里文件夹太多可以合并吗 浏览:601
php类数据库操作数据库 浏览:84
加密货币最近发生的事 浏览:260
单片机启动代码 浏览:438
16进制单片机数字代码 浏览:188
中国银行程序员加班吗 浏览:520
重命名如何转换文件夹 浏览:768
服务器账号怎么做 浏览:860
android访问api 浏览:890
app制作网站源码 浏览:975
社保pdf 浏览:159
php条件显示 浏览:322
安卓玩什么软件好 浏览:129
java如何导出 浏览:22
俱乐部源码棋牌 浏览:355