并发编程—4显式锁 Lock

4.显式锁 Lock

4.1 概念

内置锁 vs 显示锁

synchronize是java语言层面实现的锁,称为内置锁。使用方便代码简洁,而且在jdk新版本优化后,性能也得到了很大的提高。synchronize是一个可重入锁。而Lock是jdk提供开发者是用的一个显式锁。通过lock()和unlock()方法加锁和释放锁。

可重入锁 vs 不可重入锁

可重入的意思是指持有锁的线程在某种情况下,例如递归方式调用自身,此时不需要重新获得所,而是给内部维护的一个state值加1,每次方法出栈后state值减1,直到state值为0,锁被释放。

公平锁 vs 非公平锁

公平锁的含义是在并发环境,每个线程获取锁的时候,会先检查锁维护的线程等待队列,如果等待队列为空或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己;非公平锁含义是在并发环境中,不理会等待队列中是否有等待的线程获取锁,允许插队,只要当前线程是available就可以占有锁,如果尝试失败,就再采用类似公平锁那种方式。ReentrantLock在创建的时候可以指定是公平锁还是非公平锁。不指定默认是非公平锁。而且一般认为非公平锁效率更好。

读锁 vs 写锁

读写锁一般是指ReentrantReadWriteLock类,通过该类的内置类变量:readerLock和writeLock可以分别获取读锁和写锁。其实ReadLock和WriteLock,从继承关系可以看出,也是实现了Lock接口,也是显示锁的一种。在什么情况下使用读写锁呢?答案是读多写少的情况。

		/** Inner class providing readlock */
	    private final ReentrantReadWriteLock.ReadLock readerLock;
	    /** Inner class providing writelock */
	    private final ReentrantReadWriteLock.WriteLock writerLock;
		

4.2 ReentrantLock源码解读

  • ReentrantLock实现了Lock接口,本身就是一个显式锁。
  • ReentrantLock内含一个Syn类,该类实现了AbstractQueuedSynchronizer.ReentrantLock是基于AQS实现的。

posted on 2019-05-17 22:58  lukelin1989  阅读(193)  评论(0编辑  收藏  举报

导航