`
lushuaiyin
  • 浏览: 676011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA文件锁

 
阅读更多

项目使用到集群环境,流程发送时如果确保一个流程不会被两个流程同时调用?

有一种办法是用文件锁的方式来实现。

代码如下:

锁接口:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.FileNotFoundException;
  3. importjava.io.IOException;
  4. publicinterfaceLock{
  5. /**
  6. *检测是否被锁定
  7. *@returntrue被锁定,false空闲
  8. **/
  9. publicabstractbooleanisLocked()throwsFileNotFoundException;
  10. /**
  11. *获取锁资源
  12. *@returntrue成功锁定目标资源,false锁定操作失败
  13. **/
  14. publicabstractbooleanobtain()throwsIOException;
  15. /**
  16. *释放锁
  17. **/
  18. publicabstractvoidunlock();
  19. }

文件锁的实现:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. importjava.io.RandomAccessFile;
  6. importjava.nio.channels.FileChannel;
  7. importjava.nio.channels.FileLock;
  8. importjava.nio.channels.OverlappingFileLockException;
  9. publicclassFileProgrameLockimplementsLock{
  10. privateStringcallerThreadID=null;
  11. privateStringlockFileName=null;
  12. FileChannelchannel=null;
  13. privateFileLocklock=null;
  14. publicstaticLockget(StringfileName,StringcallerThreadID){
  15. FileProgrameLockd=newFileProgrameLock(fileName);
  16. d.callerThreadID=callerThreadID;
  17. return(Lock)d;
  18. }
  19. publicFileProgrameLock(StringlockFileName){
  20. this.lockFileName=lockFileName;
  21. }
  22. /**
  23. *检测是否被锁定-不建议使用
  24. *@returntrue被锁定,false空闲
  25. *@deprecated
  26. **/
  27. publicbooleanisLocked()throwsFileNotFoundException{
  28. Filetf=newFile(lockFileName);
  29. if(!tf.exists()){
  30. returnfalse;
  31. }
  32. FileChannel__channel=newRandomAccessFile(tf,"rw").getChannel();
  33. FileLocktl=null;
  34. try{
  35. tl=__channel.tryLock();
  36. if(tl==null){
  37. returntrue;
  38. }else{
  39. returnfalse;
  40. }
  41. }catch(OverlappingFileLockExceptione){
  42. returntrue;
  43. }catch(IOExceptione){
  44. returntrue;
  45. }catch(Exceptione){
  46. returntrue;
  47. }finally{
  48. try{
  49. if(tl!=null){
  50. tl.release();
  51. }
  52. tl=null;
  53. if(__channel.isOpen()){
  54. __channel.close();
  55. }
  56. __channel=null;
  57. tf=null;
  58. }catch(IOExceptione){
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. /**
  64. *获取锁资源
  65. *@returntrue成功锁定目标资源,false锁定操作失败
  66. **/
  67. publicbooleanobtain()throwsIOException{
  68. Filetf=newFile(lockFileName);
  69. createFile();
  70. channel=newRandomAccessFile(tf,"rw").getChannel();
  71. try{
  72. //System.out.println("getlock000>>>>>>>>>>>>>>>");
  73. lock=channel.lock();
  74. //System.out.println("getlock>>>>>>>>>>>>>>>");
  75. returntrue;
  76. }catch(OverlappingFileLockExceptione){
  77. returnfalse;
  78. }catch(Exceptione){
  79. returnfalse;
  80. }
  81. }
  82. /**
  83. *释放锁
  84. **/
  85. publicvoidunlock(){
  86. try{
  87. if(lock!=null){
  88. lock.release();
  89. }
  90. System.out.println(callerThreadID+"unlockXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  91. if(channel!=null&&channel.isOpen()){
  92. channel.close();
  93. }
  94. lock=null;
  95. channel=null;
  96. this.deleteFile();
  97. }catch(IOExceptione){
  98. }
  99. }
  100. protectedvoidfinalize()throwsThrowable{
  101. System.out.println(callerThreadID+this.getClass()+".finalize()");
  102. super.finalize();
  103. }
  104. privatevoidcreateFile()throwsIOException{
  105. try{
  106. Filetf=newFile(lockFileName);
  107. if(!tf.exists()){
  108. tf.createNewFile();
  109. }
  110. tf=null;
  111. }catch(IOExceptione){
  112. System.out.println(e+lockFileName);
  113. throwe;
  114. }
  115. }
  116. privatevoiddeleteFile(){
  117. Filetf=newFile(lockFileName);
  118. if(tf.exists()){
  119. tf.delete();
  120. }
  121. tf=null;
  122. }
  123. }

工厂类:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. publicclassMakeLockimplementsRunnable{
  6. privateStringthreadID="";
  7. publicvoidrun(){
  8. try{
  9. while(true){
  10. test2(threadID);
  11. Thread.sleep(200);
  12. }
  13. }catch(IOExceptione){
  14. System.out.println(e);
  15. e.printStackTrace();
  16. }catch(InterruptedExceptione){
  17. System.out.println(e);
  18. }
  19. }
  20. publicvoidtest2(StringthreadID)throwsFileNotFoundException,IOException,InterruptedException{
  21. Locklock=newMakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);
  22. System.out.println(threadID+":obtain...");
  23. booleanb=lock.obtain();
  24. //当有重叠时会发生等待,所以外侧先执行isLocked()判断
  25. System.out.println(threadID+":obtained"+b);
  26. if(b){//执行业务逻辑
  27. Thread.sleep(390);
  28. for(inti=0;i<Integer.MAX_VALUE;i++){
  29. ;
  30. }
  31. lock.unlock();
  32. }
  33. lock=null;
  34. }
  35. publicMakeLock(StringthreadID){
  36. this.threadID=threadID;
  37. }
  38. publicLockgetLock(Stringname,StringthreadID){
  39. finalStringBufferbuf=newStringBuffer();
  40. returnFileProgrameLock.get(name,threadID);
  41. }
  42. }

使用方法:

Java代码收藏代码
  1. publicvoidtest2(StringthreadID)throwsFileNotFoundException,IOException,InterruptedException{
  2. Locklock=newMakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);
  3. if(!lock.isLocked()){
  4. System.out.println(threadID+":obtain...");
  5. booleanb=lock.obtain();
  6. System.out.println(threadID+":obtained"+b);
  7. if(b){//执行业务逻辑
  8. Thread.sleep(390);
  9. for(inti=0;i<Integer.MAX_VALUE;i++){
  10. ;
  11. }
  12. lock.unlock();
  13. }
  14. }else{
  15. System.out.println(threadID+":can'tgetalock:"+lock);
  16. }
  17. lock=null;
  18. }

多线程调用测试:

Java代码收藏代码
  1. publicstaticvoidmain(String[]args){
  2. //newAAA().test();
  3. System.out.println("=========================================");
  4. Threadth1=newThread(newMakeLock("====================thread1===================="));
  5. Threadth2=newThread(newMakeLock("####################thread2####################"));
  6. Threadth3=newThread(newMakeLock("@@@@@@@@@@@@@@@@@@@@thread3@@@@@@@@@@@@@@@@@@@@"));
  7. Threadth4=newThread(newMakeLock("$$$$$$$$$$$$$$$$$$$$thread4$$$$$$$$$$$$$$$$$$$$"));
  8. Threadth5=newThread(newMakeLock("&&&&&&&&&&&&&&&&&&&&thread5&&&&&&&&&&&&&&&&&&&&"));
  9. th1.start();
  10. th2.start();
  11. th3.start();
  12. th4.start();
  13. th5.start();
  14. }

=================

经测试可以在共享文件系统下工作。

附件中AAA.java多线程测试代码可以直接运行。

项目使用到集群环境,流程发送时如果确保一个流程不会被两个流程同时调用?

有一种办法是用文件锁的方式来实现。

代码如下:

锁接口:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.FileNotFoundException;
  3. importjava.io.IOException;
  4. publicinterfaceLock{
  5. /**
  6. *检测是否被锁定
  7. *@returntrue被锁定,false空闲
  8. **/
  9. publicabstractbooleanisLocked()throwsFileNotFoundException;
  10. /**
  11. *获取锁资源
  12. *@returntrue成功锁定目标资源,false锁定操作失败
  13. **/
  14. publicabstractbooleanobtain()throwsIOException;
  15. /**
  16. *释放锁
  17. **/
  18. publicabstractvoidunlock();
  19. }

文件锁的实现:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. importjava.io.RandomAccessFile;
  6. importjava.nio.channels.FileChannel;
  7. importjava.nio.channels.FileLock;
  8. importjava.nio.channels.OverlappingFileLockException;
  9. publicclassFileProgrameLockimplementsLock{
  10. privateStringcallerThreadID=null;
  11. privateStringlockFileName=null;
  12. FileChannelchannel=null;
  13. privateFileLocklock=null;
  14. publicstaticLockget(StringfileName,StringcallerThreadID){
  15. FileProgrameLockd=newFileProgrameLock(fileName);
  16. d.callerThreadID=callerThreadID;
  17. return(Lock)d;
  18. }
  19. publicFileProgrameLock(StringlockFileName){
  20. this.lockFileName=lockFileName;
  21. }
  22. /**
  23. *检测是否被锁定-不建议使用
  24. *@returntrue被锁定,false空闲
  25. *@deprecated
  26. **/
  27. publicbooleanisLocked()throwsFileNotFoundException{
  28. Filetf=newFile(lockFileName);
  29. if(!tf.exists()){
  30. returnfalse;
  31. }
  32. FileChannel__channel=newRandomAccessFile(tf,"rw").getChannel();
  33. FileLocktl=null;
  34. try{
  35. tl=__channel.tryLock();
  36. if(tl==null){
  37. returntrue;
  38. }else{
  39. returnfalse;
  40. }
  41. }catch(OverlappingFileLockExceptione){
  42. returntrue;
  43. }catch(IOExceptione){
  44. returntrue;
  45. }catch(Exceptione){
  46. returntrue;
  47. }finally{
  48. try{
  49. if(tl!=null){
  50. tl.release();
  51. }
  52. tl=null;
  53. if(__channel.isOpen()){
  54. __channel.close();
  55. }
  56. __channel=null;
  57. tf=null;
  58. }catch(IOExceptione){
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. /**
  64. *获取锁资源
  65. *@returntrue成功锁定目标资源,false锁定操作失败
  66. **/
  67. publicbooleanobtain()throwsIOException{
  68. Filetf=newFile(lockFileName);
  69. createFile();
  70. channel=newRandomAccessFile(tf,"rw").getChannel();
  71. try{
  72. //System.out.println("getlock000>>>>>>>>>>>>>>>");
  73. lock=channel.lock();
  74. //System.out.println("getlock>>>>>>>>>>>>>>>");
  75. returntrue;
  76. }catch(OverlappingFileLockExceptione){
  77. returnfalse;
  78. }catch(Exceptione){
  79. returnfalse;
  80. }
  81. }
  82. /**
  83. *释放锁
  84. **/
  85. publicvoidunlock(){
  86. try{
  87. if(lock!=null){
  88. lock.release();
  89. }
  90. System.out.println(callerThreadID+"unlockXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  91. if(channel!=null&&channel.isOpen()){
  92. channel.close();
  93. }
  94. lock=null;
  95. channel=null;
  96. this.deleteFile();
  97. }catch(IOExceptione){
  98. }
  99. }
  100. protectedvoidfinalize()throwsThrowable{
  101. System.out.println(callerThreadID+this.getClass()+".finalize()");
  102. super.finalize();
  103. }
  104. privatevoidcreateFile()throwsIOException{
  105. try{
  106. Filetf=newFile(lockFileName);
  107. if(!tf.exists()){
  108. tf.createNewFile();
  109. }
  110. tf=null;
  111. }catch(IOExceptione){
  112. System.out.println(e+lockFileName);
  113. throwe;
  114. }
  115. }
  116. privatevoiddeleteFile(){
  117. Filetf=newFile(lockFileName);
  118. if(tf.exists()){
  119. tf.delete();
  120. }
  121. tf=null;
  122. }
  123. }

工厂类:

Java代码收藏代码
  1. packagelock;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. publicclassMakeLockimplementsRunnable{
  6. privateStringthreadID="";
  7. publicvoidrun(){
  8. try{
  9. while(true){
  10. test2(threadID);
  11. Thread.sleep(200);
  12. }
  13. }catch(IOExceptione){
  14. System.out.println(e);
  15. e.printStackTrace();
  16. }catch(InterruptedExceptione){
  17. System.out.println(e);
  18. }
  19. }
  20. publicvoidtest2(StringthreadID)throwsFileNotFoundException,IOException,InterruptedException{
  21. Locklock=newMakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);
  22. System.out.println(threadID+":obtain...");
  23. booleanb=lock.obtain();
  24. //当有重叠时会发生等待,所以外侧先执行isLocked()判断
  25. System.out.println(threadID+":obtained"+b);
  26. if(b){//执行业务逻辑
  27. Thread.sleep(390);
  28. for(inti=0;i<Integer.MAX_VALUE;i++){
  29. ;
  30. }
  31. lock.unlock();
  32. }
  33. lock=null;
  34. }
  35. publicMakeLock(StringthreadID){
  36. this.threadID=threadID;
  37. }
  38. publicLockgetLock(Stringname,StringthreadID){
  39. finalStringBufferbuf=newStringBuffer();
  40. returnFileProgrameLock.get(name,threadID);
  41. }
  42. }

使用方法:

Java代码收藏代码
  1. publicvoidtest2(StringthreadID)throwsFileNotFoundException,IOException,InterruptedException{
  2. Locklock=newMakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);
  3. if(!lock.isLocked()){
  4. System.out.println(threadID+":obtain...");
  5. booleanb=lock.obtain();
  6. System.out.println(threadID+":obtained"+b);
  7. if(b){//执行业务逻辑
  8. Thread.sleep(390);
  9. for(inti=0;i<Integer.MAX_VALUE;i++){
  10. ;
  11. }
  12. lock.unlock();
  13. }
  14. }else{
  15. System.out.println(threadID+":can'tgetalock:"+lock);
  16. }
  17. lock=null;
  18. }

多线程调用测试:

Java代码收藏代码
  1. publicstaticvoidmain(String[]args){
  2. //newAAA().test();
  3. System.out.println("=========================================");
  4. Threadth1=newThread(newMakeLock("====================thread1===================="));
  5. Threadth2=newThread(newMakeLock("####################thread2####################"));
  6. Threadth3=newThread(newMakeLock("@@@@@@@@@@@@@@@@@@@@thread3@@@@@@@@@@@@@@@@@@@@"));
  7. Threadth4=newThread(newMakeLock("$$$$$$$$$$$$$$$$$$$$thread4$$$$$$$$$$$$$$$$$$$$"));
  8. Threadth5=newThread(newMakeLock("&&&&&&&&&&&&&&&&&&&&thread5&&&&&&&&&&&&&&&&&&&&"));
  9. th1.start();
  10. th2.start();
  11. th3.start();
  12. th4.start();
  13. th5.start();
  14. }

=================

经测试可以在共享文件系统下工作。

附件中AAA.java多线程测试代码可以直接运行。

分享到:
评论

相关推荐

    Java文件锁笔记

    :Java新IO】_文件锁笔记032003

    java 文件锁的简单实现

    主要介绍了java 文件锁的简单实现的相关资料,需要的朋友可以参考下

    java文件锁的实现

    NULL 博文链接:https://sosuny.iteye.com/blog/704587

    单文件锁,锁excel word的 文件很管用

    只锁一个文件,excel word 自带密码不好用,就试一下这个吧单个文锁,目前我也没找到破解的方法,如果忘记密码的了呵呵呵,上帝保佑,如你知也通知我一下吧 ths

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等

    Java 操作 XML 文件

    java 读取 XML 使用 xml 。。。。。。。。。。。

    java多线程之并发锁

    此文档能够让读者彻底了解JAVA开发中的多线程并发锁的使用

    java文件操作

    很久以前的工具类代码不过很实用,java的文件读写创建目录复制,移动,文件序列化,反序列化,文件锁,xml文件的读取,诸多内容囊括其中注释也十分详细,学习文件流的不二选择

    基于Java的FastDFS大文件上传与断点续传设计源码

    该项目旨在实现h5与fastdfs之间的高性能断点续传、秒传、大文件上传以及使用redis文件锁。系统提供了文件上传、文件处理、文件存储等功能。通过该项目,开发者可以学习并实践Java技术的应用,为后续的Web开发奠定...

    javacore和dump分析工具

    javacore.txt文件用jca打开,heapdump.phd文件用ha打开。...包括 Java 虚拟机的参数,环境变量,内存段的分配情况,垃圾回收日志,各种内部锁的状态,各线程在当前时刻的运行栈,以及类加载状态等。

    Java 2教程(第五版)

    文件锁、映射的I/O技术以及数据结构与集合;服务器端Java技术部分讨论了JFC/Swing CGI开发、Applet、容器布局以及图形编程等技术;企业级Java技术部分讨论了JDBC API、EJB体系结构的基础知识、Java平台安全方案以及...

    Java登录时滑动图片解锁

    该文件是使用javaweb相关的知识编写的关于用户登录界面实现滑动图片解锁实现安全登录的功能项目

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    Java思维导图xmind文件+导出图片

    CDN静态文件访问 分布式存储 分布式搜索引擎 应用发布与监控 应用容灾及机房规划 系统动态扩容 分布式架构策略-分而治之 从简到难,从网络通信探究分布式通信原理 基于消息方式的系统间通信 理解通信协议...

    Java 1.6 API 中文 New

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java中锁知识的整理,文件是.xmind思维导图

    适合已经学过锁这方面知识的小伙伴进行学习,思维导图对各种锁进行了详细整理总结,采用思维导图的方式更加方便大伙们学习并记忆。

    Java Web开发技术大全.zip pdf文件

    由于Java Web开发技术大全pdf文件太大120多M,上传资源要求在20M以内,所以大家必须要把Java Web开发技术大全.z01,Java Web开发技术大全.z02,Java Web开发技术大全.z03,Java Web开发技术大全.z04,Java Web开发...

    文件夹、文件加密码锁工具

    直接给文件夹的内容加上一个密码锁,可以防止外人访问内容。

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分线程.mp4 │ Java面试题14.线程并发库和线程池的作用?.mp4 │ Java面试题15.设计模式和常用的设计模式.mp4 │ ...

Global site tag (gtag.js) - Google Analytics