文件锁

NIO(New IO)

為{幸葍}努か 提交于 2020-03-31 10:34:57
前面介绍 BufferedReader 时提到它的一个特征——当 BufferedReader 读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用 InputStream 的 read() 方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流、输出流都是阻塞式的输入、输出。不仅如此,传统的输入流、输出流都是通过字节的移动来处理的(即使不直接去处理字节流,但底层的实现还是依赖于字节处理),也就是说,面向流的输入/输出系统一次只能处理一个字节,因此面向流的输入/输出系统通常效率不高。 从 JDK 1.4 开始,Java 提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),新增了许多用于处理输入/输出的类,这些类都被放在 java.nio 包以及子包下,并且对原 java.io 包中的很多类都以 NIO 为基础进行了改写,新增了满足 NIO 的功能。 Java 新IO概述 新IO和传统的IO有相同的目的,都是用于进行输入/输出,但新IO使用了不同的方式来处理输入/输出,新IO采用内存映射文件的方式来处理输入/输出, 新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了 (这种方式模拟了操作系统上的虚拟内存的概念), 通过这种方式来进行输入/输出比传统的输入

Java读取文件加锁代码Demo(利用Java的NIO)

ぃ、小莉子 提交于 2020-03-15 05:46:54
本博文部分转载于: http://blog.csdn.net/wangbaochu/article/details/48546717 Java 提供了文件锁FileLock类,利用这个类可以控制不同程序(JVM)对同一文件的并发访问,实现进程间文件同步操作。 FileLock是Java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情, 这样的机制保证了众进程可以顺序访问该文件。也可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件, 但也可以通过 FileLock 来进行并发控制,保证进程的顺序执行,避免数据错误。 “Locks are associated with files, not channels. Use locks to coordinate with external processes, not between threads in the same JVM.” 1. 概念 共享锁: 共享读操作,但只能一个写(读可以同时,但写不能)。共享锁防止其他正在运行的程序获得重复的独占锁,但是允许他们获得重复的共享锁。 独占锁: 只有一个读或一个写(读和写都不能同时)

linux下的进程间通信概述

老子叫甜甜 提交于 2020-01-21 00:06:03
管道(PIPE) FIFO(有名管道) XSI消息队列 XSI信号量 XSI共享内存 POSIX信号量 域套接字(Domain Socket) 信号(Signal) 互斥量(Mutex) 其中信号(signal)和信号量(semaphore)本质上并不算是进程间通信方式,应该是进程间同步的方式,但是也可以起到一定的通信作用,故也列在上面。另外普通的mutex是作用线程间同步用的,但是可以将进程A和进程B共享的内存中初始化一个mutex,这样就可以用将此mutex用作进程间通信用了。 各种通信方式的比较和优缺点 管道:速度慢,容量有限,只有父子进程能通讯,是最基本的进程间通信。 FIFO:任何进程间都能通讯,但速度慢 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 信号量:不能传递复杂消息,只能用来同步 共享内存区:能够很容易控制容量,是速度最快的进程间同步方式,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存 各种方法适用场景 : 1. 管道: 只能用于具有亲缘关系的进行通信,使用面相对较窄,实际开发中较少使用。管道和FIFO最适合在进程之间实现生产者/消费者的交互; 2. FIFO(命名管道)

进程间锁

帅比萌擦擦* 提交于 2020-01-15 01:30:29
目录 15.1 进程间pthread_mutex 15.2 文件锁 15.1 进程间互斥锁 直接上原语吧: # include <pthread.h> int pthread_mutexattr_init ( pthread_mutexattr_t * attr ) ; int pthread_mutexattr_destroy ( pthread_mutexattr_t * attr ) ; int pthread_mutexattr_setpshared ( pthread_mutexattr_t * attr , int pshared ) ; pshared : PTHREAD_PROCESS_PRIVATE:线程锁 PTHREAD_PROCESS_SHARED:进程锁 示例代码: /* 互斥量 实现 多进程 之间的同步 */ # include <unistd.h> # include <sys/mman.h> # include <pthread.h> # include <sys/types.h> # include <sys/wait.h> # include <fcntl.h> # include <string.h> # include <stdlib.h> # include <stdio.h> struct mt { int num ; pthread

Java复习--IO(输入/输出){Java NIO}

本小妞迷上赌 提交于 2019-12-10 19:34:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> http://my.oschina.net/u/2263278/blog/508770 中介绍的BufferedReader时提到它的一个特征----当BufferedReader读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用InputStream的read()方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流、输出流都是阻塞式的输入、输出。传统的输入流、输出流都是通过字节的移动来处理的,即使我们不直接去处理字节流,但底层的实现还是依赖于字节处理,面向流的输入/输出系统一次只能处理一个字节,因此面向流的输入/输出系统通常效率不高。从JDK1.4开始,Java提供了一些新IO,这些类都放在java.nio包及其子包下。 一、Java新IO概述 Java的NIO采用了内存映射文件的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式进行输入/输出比传统的输入/输出要快的多。 Channel和Buffer是NIO中两个核心对象,Channel是对传统的输入/输出系统的模拟,在NIO系统中所有的数据都需要通过通道Channel传输

Android进程保活招式大全

让人想犯罪 __ 提交于 2019-12-04 14:48:49
作者:腾讯——张兴华 目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题。本文对 Android 进程拉活进行一个总结。 Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被杀死的概率 B. 在进程被杀死后,进行拉活 本文下面就从这两个方面做一下总结。 1. 进程的优先级 Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入“重要性层次结构”中。 必要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。 进程的重要性,划分5级: 前台进程(Foreground process) 可见进程(Visible process) 服务进程(Service process) 后台进程(Background process) 空进程(Empty process) 前台进程的重要性最高,依次递减,空进程的重要性最低,下面分别来阐述每种级别的进程 1.1. 前台进程 —— Foreground process 用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 A.

svn checkout到挂载目录遇到的问题

白昼怎懂夜的黑 提交于 2019-12-04 05:57:25
SVN version : 1.7.9 我用虚拟机搭建了一个linux然后把windows下的某个文件挂载到linux下面,然后使用svn checkout检出文件的时候遇到svn: E200033: database is locked, executing statement 错误,使用 strace工具来检查发了是在创建sqlite_db的时候系统文件锁不一样造成的,但是要怎么解决这个问题呢? 没有头绪问题还是要解决的,想一想系统文件锁不一样,那我能不能把挂载的模式改下呢?? 查看了mount的手册资料,发现它有一个选项能nobrl不发送字节锁到服务器,这样子就解决了系统文件锁不一致照成的这一问题。 来源: oschina 链接: https://my.oschina.net/u/251494/blog/128327