简单 谈谈 关于 锁 的常见问题
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)循环等待条件:在发生死锁前,必然存在一个进程等待队列,形成进程等待环路,前一个进程占有后一个进程所申请的资源。
本文来自博客园,作者:岑惜,转载请注明原文链接:https://www.cnblogs.com/c2g5201314/p/13111113.html
响应开源精神相互学习,内容良币驱除劣币