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

Posted c2g5201314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单 谈谈 关于 锁 的常见问题相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

4.Synchronized有哪些缺点?

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

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

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

 

以上是关于简单 谈谈 关于 锁 的常见问题的主要内容,如果未能解决你的问题,请参考以下文章

第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

转谈谈 JVM 内部锁升级过程

JAVA面试题 请谈谈你对Sychronized关键字的理解?

#yyds干货盘点# Java | 关于synchronized相关理解

JDK源码笔记之Integer深度解析以及并发下错误的加锁方式踩坑笔记

面试官:可以谈谈乐观锁和悲观锁吗