首页 cms教程 正文
synchronized(synchronized是悲观锁吗)

 2023-11-03    bigbai  

synchronized(synchronized是悲观锁吗)

1、是一个悲观锁的实现,因为它假设任何时候都有可能发生竞争,因此在执行同步代码块前会先获得锁,并且如果获取不到锁就会一直等待。这样可以确保在同一时间只有一个线程可以访问共享资源,从而保证线程安全。

2、但是这种做法会带来一定的性能损失,因为大部分时间锁并没有被竞争,但是所有线程都需要等待。相比之下,乐观锁的实现原理是假设竞争很少发生,因此在执行同步代码块前不会先获得锁,而是直接执行操作。在更新共享资源时,先读取资源的版本号,然后进行更新操作。

3、如果其他线程在此期间修改了共享资源,那么版本号就会发生变化,此时更新操作会失败。此时,当前线程可以选择放弃操作,也可以重新尝试更新操作。

4、乐观锁的实现方式通常会比悲观锁更加高效,因为大部分时间不需要等待锁的释放。是一种基于乐观锁实现的原子操作。它的原理是先比较共享资源的当前值和期望值是否相等,如果相等就使用新值替换当前值。操作可以保证原子性,因为在执行操作期间,如果共享资源的值发生变化,操作会失败,此时就会重新尝试操作,直到成功为止。

5、操作具有以下特性:原子性:操作是一种原子性操作,可以保证在同一时刻只有一个线程可以修改共享资源。无锁操作:操作不需要加锁,因此不会引起线程阻塞和切换,效率比较高。问题:如果共享资源的值在操作过程中从变成了,然后再从变成了,那么操作会错误地认为共享资源的值没有发生变化,从而引发潜在的问题。为了解决这个问题,可以使用版本号等机制来避免。

synchronized(synchronized是悲观锁吗)

1、需要注意的是,操作虽然能够提高性能,但是也有一定的局限性,比如只能适用于单个共享变量的操作,不能适用于复合操作等场景。在使用操作时需要根据实际场景进行取舍。

  •  标签:  

原文链接:https://www.bigbai.cc/news/7249.html

本文版权:如无特别标注,本站文章均为原创。