线程锁/进程锁/文件锁

> 线程锁/进程锁/文件锁
 1.线程锁是锁线程的,锁住禁用,如果4线程的CPU锁一个线程剩余三个(如果可以锁的话),就像四车道封锁一条车道还剩3个车道可以跑车;
 2.进程锁是锁进程的,进程就是正在运行的程序,锁住进程就是锁住程序禁止程序的任何操作,就像锁住汽车不能开车一样。
 3.文件锁是锁文件的,文件锁住就无法使用,必须解锁才可以使用。

  通过对文件上锁,只有拥有锁的进程才能拥有对应锁权限的操作权限。而没有锁的进程只能挂起或者处理其他的事务直到拥有锁。从而在并发的场景下,我们才能对文件的读写进行控制。获取的文件锁是进程之间的锁。

-- lock()和tryLock()的区别:
lock()方法当无法获得锁时会阻塞。是阻塞式的,它要阻塞进程直到锁可以获得,或调用lock()的线程中继,或调用lock()的通道关闭
对独占锁和共享锁的支持必须由底层的操作系统提供。锁的类型可以通过FileLock.isShared()进行查询,我们不能获取缓冲器上的锁,只能是通道上的。
tryLock()方法当无法获得锁时会获得null值。是非阻塞式的,它设法获取锁,但如果不能获得,例如因为其他一些进程已经持有相同的锁,而且不共享时,它将直接从方法调用返回。
  虽然常规都是使用new RandomAccessFile(file,”rw”).getChannel().lock();获得锁。但是如果使用new FileInputStream(file).getChannel().lock();获得锁时。会抛出NonWritableChannelException异常。
  如果使用new FileOutputStream(file).getChannel().lock()时,会先将原文件的内容清空,因此最好使用new FileOutputStream(file,true).getChannel().lock()。

> 共享锁和独占锁区别
  1.独占锁:也称排它锁,如果一个线程获得一个文件的独占锁,那么其它线程就不能再获得同一文件的独占锁或共享锁,直到独占锁被释放;当a.txt文件被加独占锁时  其它线程不可读也不可写;
  2.共享锁:如果一个线程获得一个文件的共享锁,那么其它线程可以获得同一文件的共享锁或同一文件部分内容的共享锁,但不能获取排它锁;当a.txt文件被加共享锁时  其它线程可读但不可写;
  如何获得共享锁fc.tryLock(position,size,isShare);第三个参数为true时,为共享锁。

 volatile只保证可见性,不保证原子性!

你可能感兴趣的:(线程锁/进程锁/文件锁)