
前提目标表要有索引,查询要开启事物,使用select * from tb with(updlock) where col = xxx将一行数据锁住,其他连接不能再修改表
对象是一个锁标志。按照先到先得的原则,如果有多个线程都会执行代码,并使用同一个对象作为锁,synchronize(对象){
....
}
那么,先执行这段代码的那个线程,将会获得这个对象锁,而当这个线程执行这段代码的时候,其他线程也是使用这个对象作为锁的,就不能执行这段代码,知道最初得到这个锁的线程运行完这段代码,然后再把锁分配给下一个线程执行。
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,因此,不能锁住文件。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)