博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发中的锁文件模式
阅读量:6389 次
发布时间:2019-06-23

本文共 2600 字,大约阅读时间需要 8 分钟。

并发中的锁文件模式是Java企业设计模式中的一种。可以是本地锁,也可以分布式锁,看文件系统是本地还是分布式的,算是一种比较古老的方式。利用zk实现分布式锁,其实跟这个也比较类似。zk其本质是个树形结构。

代码

import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;/** * Subclass of RandomAccessFile that always ensures that it * has exclusive access to a file before opening it. */public class ExclusiveRandomAccessFile extends RandomAccessFile {    private static final String LOCK_FILE_SUFFIX = ".lck";    private File lockFile;    /**     * Open the named file using a lock file to ensure     * exclusive access.     * @param fileName The name of the file to open.     * @param mode This should either be "r" for read-only     *             access or "rw" for read-write access.     * @exception FileSharingException     *            If there is already a lock file for the named     *            file.     * @exception IOException     *            If there is a problem opening the file     */    public static ExclusiveRandomAccessFile openExclusive(String fileName,                                            String mode)            throws IOException {        File lockFile = new File(fileName+LOCK_FILE_SUFFIX);        //createNewFile是原子操作        if (!lockFile.createNewFile()) {            // lock file already exists            throw new FileSharingException(fileName);        } // if        return new ExclusiveRandomAccessFile(fileName,                mode,                lockFile);    } // openExclusive(String)    /**     * Construct a RandomAccessFile that has exclusive access     * to the given file.     * @param fileName The name of the file to open.     * @param mode This should either be "r" for read-only     *             access or "rw" for read-write access.     * @param lockFile A file object that identifies the lock     *                 file.     */    private ExclusiveRandomAccessFile(String fileName,                                      String mode,                                      File lockFile)            throws IOException {        super(fileName, mode);        this.lockFile = lockFile;    } // constructor(String, String)    /**     * Close this file.     */    public synchronized void close() throws IOException {        if (lockFile!=null) {   // If file is still open            lockFile.delete();            lockFile = null;            super.close();        } // if    } // close()}class FileSharingException extends IOException {    public FileSharingException(String msg) {        super(msg);    } // constructor(String)} // class FileSharingException

要点

1、检查文件如果不存在则创建,要是原子操作,使用File.createNewFile即可实现

2、锁占用过长怎么处理?或者忘记解锁怎么处理?

转载地址:http://umdha.baihongyu.com/

你可能感兴趣的文章
DLP测试样本
查看>>
用户空间与内核空间数据交换的方式(zz)
查看>>
C Statements
查看>>
高性能ASP.NET站点构建之简单的优化措施
查看>>
“习惯性思维”引起的血案
查看>>
Myeclipse快捷键
查看>>
rundll32.exe文件详解
查看>>
线程安全的Generic Dictionary
查看>>
Oracle 并行原理与示例总结
查看>>
freebsd+postfix+mysql+authdaemon+sasl2+bind9
查看>>
Yii2与Yii1的模块中Layout使用区别
查看>>
2003迁移到 Server 2008
查看>>
配置安全的windows2003服务器
查看>>
Java基础知识回顾-6
查看>>
运维监控利器Nagios:概念、结构和功能
查看>>
Lync和Exchange 2013集成PART5:UCS和HD头像
查看>>
DPM2007轻松恢复Exchange邮件,DPM2007系列之三
查看>>
在Mybatis3开发中与配置相关的7点体会
查看>>
SaltStack入门(二)Grains、NoteGroup和State
查看>>
oracle 数据库开发应用实例,招生录取系统,oracle与plsql教程打包下载
查看>>