Created
March 3, 2015 06:59
-
-
Save syazawa/d1f6bf4553dcc469709b to your computer and use it in GitHub Desktop.
Example of inter-process and inter-thread file locking in Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.File; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.nio.channels.FileLock; | |
// The class demonstrates how to get an exclusive file lock that prevents other threads and processes / JVMs from | |
// obtaining a lock on the same file. To do this, you need to synchronize a block on a file and acquire FileLock. See | |
// comments below for more details. Run this class in multiple JVMs and see each thread of each JVM acquires a lock in | |
// an orderly fasion. | |
public class FileLocking extends Thread | |
{ | |
private static final File file = new File("lock.test"); | |
public static void main(String[] args) throws Exception | |
{ | |
for (int i = 0; i < 5; i++) { | |
new FileLocking().start(); | |
} | |
} | |
@Override | |
public void run() | |
{ | |
// synchronized on a static variable "file" so that threads don't try to acquire a lock on it at the same | |
// time. Javadoc of FileLock states "File locks are held on behalf of the entire Java virtual machine. They are | |
// not suitable for controlling access to a file by multiple threads within the same virtual machine." What this | |
// actually means is that if two threads tries to get a lock on the same file, one fails with | |
// OverlappingFileLockException instead of waiting for a release of the lock. | |
synchronized(file) { | |
FileOutputStream fos = null; | |
try { | |
fos = new FileOutputStream(file); | |
// Synchronization doesn't have any effect on threads running on a different JVM, of | |
// course. FileChannel.lock() acquires a lock on a file that prevents another process from getting a | |
// lock on it. The method waits until a lock is released if the lock is held by a different process, as | |
// opposed to throwing exception when the lock is held by a thread in the same JVM. | |
FileLock lock = fos.getChannel().lock(); | |
System.out.println("Got a lock in " + getName()); | |
// do some file write operation | |
sleep(1000); | |
fos.close(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} finally { | |
if (fos != null) { | |
try { | |
fos.close(); | |
} catch (IOException ex) { | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment