分享并发编程网上多线程面试题之【锁】



1. 什么是可重入锁(ReentrantLock)?


public class ReentrantLock implements Lock, java.io.Serializable

 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。还提供在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上)            

通俗解释: 可重入锁意思是自己获得锁以后,自己还可以进入锁之中。 

扩展阅读 http://ifeve.com/reentrantlock-and-fairness/


2. 当一个线程进入某个对象的synchronized的实例方法后,其它线程是否可进入此对象的其它方法?


    可以进入此对象的非synchronized 方法

3. synchronized 和 java.util.concurrent.locks.Lock的异同?


    主要相同点:Lock能完成synchronized所实现的所有功能

    主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放(如果出现不在finally中释放的情况,当抛出异常时,线程直接死掉。但是没有释放锁,使得其他相关线程无法执行。可以试试定义一个数组,并访问越界区,使得程序抛出异常,但是并未在finally中释放锁)。

扩展阅读:http://c610367182.iteye.com/blog/1954642


4. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?


乐观锁比较乐观考虑【经常不会】发生并发的情况为主。

悲观锁比较悲观考虑【经常会发生】并发 的情况为主。

实现方式:乐观锁 concurrentLinkQueen

             悲观锁 synchronized  lock

5. 简单介绍一下对Synchronized的理解


一般来讲有四种用法

   1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 

   2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 

   3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 

   4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

想学怎么用推荐: http://blog.csdn.net/luoweifu/article/details/46613015

了解更深入的原理: http://ifeve.com/java-synchronized/



一切都是对象 —— Everything is an object