同步锁、死锁、乐观锁、悲观锁?
时间: 2023-06-10 20:05:29 浏览: 163
同步锁,也称为互斥锁,是一种并发控制的方式。同步锁可以保证同一时刻只有一个线程可以访问共享资源,以避免竞态条件的出现。死锁是指两个或多个线程互相持有对方所需要的资源,导致彼此都无法继续执行的情况。乐观锁和悲观锁是两种并发控制方式。悲观锁是在执行操作前先加锁,以避免并发访问的冲突。而乐观锁则是假设不会有并发冲突,只在提交数据时判断是否发生冲突,如果发生冲突则进行回滚或者重试操作。
相关问题
为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
Synchronized 是一个悲观锁,因为它假设在任何时候都有可能发生并发冲突,所以会一直占用锁直到操作完成,这样会导致效率较低。而乐观锁则假设并发冲突不太可能发生,因此不会一直占用锁,而是在执行操作前检查是否有其他线程对数据进行了修改,如果没有就执行操作,如果有则重试。
乐观锁的实现原理一般有两种:一种是使用版本号机制,即在数据中增加一个版本号字段,每次操作时都会检查版本号是否一致,如果不一致则说明有其他线程修改了数据,操作失败,需要重试;另一种是使用CAS(Compare and Swap)操作,即先读取数据和版本号,然后尝试修改数据和版本号,如果版本号没有变化,则修改成功,否则说明有其他线程修改了数据,需要重试。
CAS(Compare and Swap)是一种原子操作,它能够在多线程环境下实现同步访问共享变量,避免了使用锁的开销。CAS操作包含三个参数:内存地址V、旧的预期值A、新的值B。如果当前内存地址V上存放的值与预期值A相等,则将内存地址V上的值修改为新的值B,否则不做任何操作。CAS的特性包括:原子性、不阻塞、无锁、无死锁。
j ava乐观锁与悲观锁
Java中的synchronized和Lock都是用于实现线程同步的机制。
synchronized是Java中的关键字,可以用于修饰方法或代码块,用于保证同一时刻只有一个线程可以执行被synchronized修饰的代码。synchronized是Java中最基本的同步机制,使用方便,但是在某些情况下可能会出现死锁等问题。
Lock是Java中的接口,提供了比synchronized更加灵活的同步机制。Lock可以实现更细粒度的控制,例如可以实现公平锁或非公平锁,可以在等待锁的时候响应中断等。但是使用Lock需要手动进行加锁和解锁,使用起来相对麻烦。
总的来说,synchronized适用于简单的同步场景,而Lock适用于更加复杂的同步场景。但是在Java 5之后,由于Lock的出现,synchronized也进行了一些优化,例如引入了偏向锁、轻量级锁等机制,使得synchronized的性能也得到了提升。
阅读全文
相关推荐
















