简单 谈谈 关于 锁 的常见问题

1.线程同步的几种方式有哪些?

synchronized修饰 、使用Lock、使用容器类如ConcurrentHashMap 等。

2.synchronized和java.util.concurrent.locks.Lock的 区别有哪些?

(1)Lock必须在finally块中释放 ,否则,如果在运行受保护的代码时,抛出了异常,那么该锁将永远不能释放,会形成死锁;
(2)synchronized 块必须完成的被包含在一个方法中,而 Lock对象 可以把 调用 lock()和 unLock()方法放在不同的方法里面;
(3)synchronized 不能保证进入访问等待的线程的访问循序,因此无法设置 synchronized 代码块的访问等待超时时间。

3.乐观锁和悲观锁怎么理解,如何实现?

乐观锁,每次操作都不加锁,一般是配合数据库使用 ,会在数据库存储版本号 或者时间戳 字段,每次以此为限制条件 与数据 库的值做对比,对比相同说明抢到操作权限,每次操作时修改版本号或时间戳;
悲观锁则每次操作都会导致其他需要锁的线程挂起,等待锁释放后才允许下一个线程使用,可使用 synchronized 或 Lock实现。

4.Synchronized有哪些缺点?

(1)只能有一个对象锁与锁相关联,无法多个同时使用;
(2)使用Synchronized的线程如果正在等待获取锁时 ,将无法中断,如果是多线程竞争一个锁,那么还没有获得锁的线程将一直等待下去,也就是同步阻塞。

5.简单说说 死锁产生的四个条件 分别是什么 ?

(1)互斥条件:只有等待获得锁的进程释放锁,才允许下一个进程获得锁。
(2)不可剥夺条件:如果获取锁的进程还没有释放锁,那么不能被其他进程强制剥夺,需要等其主动释放才允许下一个进程获得。
(3)请求和保持条件:进程获得资源后,在未使用完毕之前,又申请新的资源的同时,会一直保持已经分配到的资源。
(4)循环等待条件:在发生死锁前,必然存在一个进程等待队列,形成进程等待环路,前一个进程占有后一个进程所申请的资源。

 

posted @ 2020-06-12 23:19  岑惜  阅读(364)  评论(0编辑  收藏  举报