java 中锁的相关概念

多线程确实给我们在效率上给我们带来了很大的便利,但是不得不考虑多个线程之间对资源竞争引起的安全问题。同步关键字synchronized是我们比较熟悉的用来解决线程安全的一个关键字,但是锁(Lock)是一个在资源竞争激励的情况下性能更优于synchronized的方法。
1.可重入锁
如果锁具备可充入性,则成为可充入锁,像synchronized和Reentrant都是可重入锁,可重入性时间是表明锁的分配机制是基于线程分配的,而不是基于方法调用分配的。简单点理解就是方法A是同步方法,A中还要执行另外一个同步方法B(同一个类中的),这个时候是不需要重新去获取锁的,要不然不就成了一直自己在等待自己释放锁了····
2.可中断锁
顾名思义,就是可以中断执行的锁,在java中,synchronized就是不可中断的锁,因为他是自己释放锁的,而lock就是可中断锁,
3.公平锁
从字面上看就是突出公平,也就是排队拿锁,尽量以请求锁的顺序获取锁,比如有多个线程等待一个锁,等待时间最久的(最先请求的线程)会获取锁,这样就是公平锁。在Java中,synchronized就是非公平锁,而lock默认是非公平的,但是初始化的时候可以设置为公平锁,初始化构造方法参数设置true就可以了
4.读写锁
关于使用读写锁就是在读的时候上读锁,写的时候上写锁,主要用来解决synchronized不能解决的问题(两个线程同时读,理论上是可以并行的,但是synchronized是加了锁的)。提高性能,通过使用读写锁,可以让读与读之间不互斥。
ReadWriteLock是一个接口,该接口只有两个方法,读锁和写锁,也就是说我们在写文件的时候,可以将读写分开,分成两个锁来分配给线程。从而做到读和读互不影响。读和写互斥,写和写互斥,提高读写文件的效率。
模拟一下synchronized实现同时读写文件
java 中锁的相关概念

执行效果如下:
java 中锁的相关概念
在读取文件是理想的逻辑应该是两个线程可以同时读,因为读没有写操作,但是使用synchronized的时候,它是不区分读写的,锁的就是这个方法,所以效率方面还是有提升的空间

同样的读写,使用lock测试

java 中锁的相关概念

执行效果如下:
java 中锁的相关概念
两个线程可以同时执行读操作,效率翻倍。

不过要注意的是,如果一个线程占用了读锁,则此时其他线程此时需要申请写锁则申请写锁的线程会一直等待释放读锁,如果一个线程已经占用了写锁,则其他线程如果申请写锁或者读锁,则申请的线程会一直等待释放写锁。