`
longgangbai
  • 浏览: 7338936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

       java提供了强制原子性的内部锁机制:synchronized块。一个synchronized块有两个部分:锁对象的引用和锁保护的代码块。synchronized方法上面的锁也分两种:对象锁和类锁。当该方法为static方法时,该方法获取到的锁为该Class对象锁。

重进入?
          当某个线程进入A方法的时候获取到了对象锁;但是在A方法中需要调用B方法也需要对象锁;这个时候对象锁已经在进入A方法前被当前线程已经拿到了,我们思考下线程时候会进入死锁?还是会继续往下执行呢?
        程序会往下执行的,原因是B方法能够识别到对象锁在该线程上;并且线程在每次利用同一个对象锁时都会做一个计数;当每退出一个方法的时候会减1,当计算为0的时候锁才能被释放。这样就达到了一个线程中一个对象锁可以调用一个类中的多个同步方法。 这个就是多线程的“重进入”概念。

 

文件锁

 

        JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制

 

          注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两次锁定同一文件或某文件里的同一区域,tryLock与lock则会抛出OverlappingFileLockException异常。

 

          要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们是从单进程实体继承而来;一般来说,你是不会让两个进程去共享一个网络socket的。 tryLock( ) 是非阻塞的,它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回;而lock( )是阻塞的,如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它的线程,或者关闭了它要lock()的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。

          还可以像这样锁住文件的某一部分tryLock(long position, long size, boolean shared) 或者lock(long position, long size, boolean shared)

这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示是否是共享锁。

 

            虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。

 

           锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个共享锁,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。

 

                 在写文件时才能锁定,如果对一个只读文件通道进行锁定操作时,会抛NonWritableChannelException异常,即new FileInputStream("data2.txt").getChannel().tryLock();时就会抛异常。

 

           另外锁定写文件通道new FileOutputStream("data2.txt").getChannel().tryLock();时,它会清掉原文件中的内容,所以当文件中有内容时最好使用 new FileOutputStream("data2.txt",true).getChannel().tryLock(); 以追加方式打开写文件通道。或者使用RandomAccessFile类来创建文件通道然后锁定 new RandomAccessFile("data2.txt","rw").getChannel().tryLock(); ,这样它不会破坏锁定的文件的内容。

 

    最后在使用tryLock()获取锁时, 有可能获取不到,这时就会为null,我们需能对此做相应处理。以下是简单的销实例:

 

package com.etrip.concurrent.locks;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;
/**
 * 
 * 针对文件锁FileLock,建议采用try-finally方式释放文件锁对象
 * 
 * 
 * @author longgangbai
 */
public class FileLocking { 
    public static void main(String[] args) { 
        FileOutputStream fos;
        FileLock fl = null;
		try {
			fos = new FileOutputStream("file.txt");
			 //获取文件锁 FileLock 对象 
	        fl = fos.getChannel().tryLock(); 
	        //tryLock是尝试获取锁,有可能为空,所以要判断 
	        if (fl != null) { 
	            System.out.println("Locked File"); 
	            Thread.sleep(100); 
	           
	        } 
	        fos.close(); 
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//判断锁释放存在 和有效
			if( fl!=null && fl.isValid()){
				 try {
					fl.release();//释放对象锁
					System.out.println("Released Lock"); 
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}//释放锁 
			}
		}
       
    } 
}  

 

 

分享到:
评论

相关推荐

    Java文件锁笔记

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

    java文件锁的实现

    在Java编程语言中,文件锁是一种用于控制对...总的来说,理解并熟练使用Java中的文件锁对于构建高效且可靠的文件操作程序至关重要。合理利用文件锁,可以确保在并发环境下数据的一致性和完整性,避免不必要的数据冲突。

    java 文件锁的简单实现

    在 Java 中,可以使用 FileLock 类来实现文件锁。下面将详细介绍 Java 文件锁的简单实现。 什么是文件锁 文件锁是一种机制,它允许程序控制文件的访问和修改,以确保文件的安全性和一致性。当多个程序同时访问同一...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    在给定的压缩包文件中,我们关注的是"FastCopyFile.java"、"UseFloatBuffer.java"以及NIO中的文件锁功能。 首先,让我们详细了解一下`FastCopyFile.java`。这个文件很可能是一个示例程序,演示了如何使用Java NIO...

    java 强制删除使用中的文件

    4. **文件锁和JNI**:如果文件被Java进程自身锁定,可以使用JNI(Java Native Interface)调用本地方法解锁,但这涉及到更复杂的编程,且不适用于所有情况。 5. **安全删除策略**:在尝试强制删除之前,确保文件...

    java 写文件 java 写文件 java 写文件 java 写文件

    7. **同步写入**:如果多线程环境需要同时写入文件,可以考虑使用FileChannel的锁机制,以防止数据交错。 8. **字符编码**:默认情况下,FileWriter使用平台默认编码。如果需要指定特定编码,可以使用`new ...

    简单java文件过滤

    当然,实际应用中可能需要考虑更多因素,如错误处理、文件锁、并发访问等。在大型项目中,你可能会选择使用Apache Commons IO库或Java 8的Stream API来简化文件操作。 总的来说,“简单java文件过滤”涉及了Java中...

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

    java分布式锁实现代码

    本文将深入探讨如何使用Redisson和Curator框架来实现Java环境中的分布式锁。 首先,让我们来看一下Redisson实现的分布式锁。Redis是一个高性能的键值数据库,常被用作分布式系统的缓存或数据存储。Redisson是基于...

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

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

    Java 操作 XML 文件

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

    JAVA 使用数字证书加密解密文件

    本文将深入探讨如何使用Java语言结合RSA算法,通过数字证书实现文件的加密和解密操作。RSA是一种非对称加密算法,它的核心在于一对密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;而私钥必须保密,用于解密...

    Java版文件系统

    然而,通过使用Java提供的类库和API,我们可以构建一个模拟的文件系统,它能够进行基本的文件操作,如创建、读取、写入和删除文件。以下是一些关于这个话题的关键知识点: 1. **Java I/O流**:Java的I/O流是实现...

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

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

    java 分割文件 将大文件分割成小文件

    例如,如果文件正在被其他进程使用,可能需要实现锁机制。同时,确保在处理文件后正确关闭输入/输出流,以防止资源泄露。 总结起来,Java提供了丰富的API来处理文件操作,包括分割大文件。通过结合`FileInputStream...

    基于Java向zip压缩包追加文件

    - 为了保证操作的原子性,可以考虑在处理过程中使用文件锁,以防止在压缩过程中文件被其他进程修改。 - 如果ZIP文件非常大,解压和再压缩的过程可能会消耗大量时间和资源,因此在处理大数据量时需要谨慎设计。 6....

    java 加密锁例子

    在Java编程环境中,加密锁(通常称为硬件保护锁或安全密钥)是一种物理设备,用于保护软件不被非法复制和使用。加密锁通常通过USB接口连接到计算机,它包含一个微处理器,可以执行复杂的加密算法,确保只有授权的...

    java实现多线程文件传输

    10. **安全性**:在多线程环境下,文件操作需注意文件锁,避免同一时刻多个线程修改同一文件,造成数据混乱。 通过以上知识点的综合运用,我们可以构建一个高效、安全的多线程文件传输系统。实际编程中,还需要根据...

    java大文件上传

    这里需要注意文件锁的管理,以防止并发上传时的文件冲突。 对于断点续传,`plupload`会在客户端保存上传进度,如果上传中断,用户可以继续未完成的上传,服务器端需要有相应的机制识别并处理这些续传请求。这通常...

    自己用JAVA做的一个多线程文件服务器

    在IT行业中,文件服务器是用于存储和管理网络上共享文件的重要组件,而使用Java实现这样的系统,开发者可以利用其跨平台特性和强大的网络编程库。 【描述】: 通过提供的链接(https://code.iteye.com/blog/247017...

Global site tag (gtag.js) - Google Analytics