并发编程相关面试题四
一、Java开发中用过哪些锁 1、乐观锁 乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的 乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升; 乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 2、悲观锁 悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。 悲观锁适合写操作非常多的场景; 悲观锁在Java中的使用,就是利用各种锁; 3、独享锁 独享锁是指该锁一次只能被一个线程所持有。 独享锁通过AQS来实现的,通过实现不同的方法,来实现独享锁。 对于Synchronized而言,当然是独享锁。 4、共享锁 共享锁是指该锁可被多个线程所持有。