JAVA锁 synchronized ReentrantLock 公平锁 非公平锁

synchronized(锁)与 ReentrantLock(可重入锁) 对比

1. Synchronized :编译器去保证锁的加锁和释放。ReentrantLock:程序员手动进行加锁和释放。

2.便灵性:synchronized 使用更便利。

3.性能:reentrantlocak 更好,尝试在用户态解决加锁问题,避免进入内核的线程阻塞。

 

相同:都是同步锁,但是,Synchronized线程阻塞和唤醒的代价高。

reentrantLocak实现原理

CAS

https://www.cnblogs.com/zhangfengshi/p/9203191.html

公平锁和非公平锁对比

公平锁:线程请求锁时,如果另一个线程占用锁或者队列不为空,将该线程加入队列。

非公平锁:线程请求锁时,锁没有被占用,就尝试获取锁;锁被占用,才会放入队列。

优缺点分析:

非公平锁性能高于公平锁性能。恢复一个被挂起的线程比较耗时,且非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。

但非公平锁存在抢占,可能会造成线程饿死。

 

 

 

乐观锁和悲观锁:

https://blog.csdn.net/qq_34337272/article/details/81072874

 

悲观锁:

每次拿数据的时候都担心别的线程会修改,因此每次拿数据都会加上锁。

乐观锁:

假设拿数据的时候不会被别的线程修改,因此拿数据不会加锁,但是修改数据的时候需要进行比较,看该数据是否被别的线程修改(可版本号机制,CAS实现)。

版本号:

拿数据的时候取一个version,修改数据时,会查看当前版本号与数据库版本号是否一致,一致就可以更改,否则重试。

CAS:

(非阻塞同步)存该数据原来的值A,修改数据时,看该数据是否仍然为A,如果为A,则更新。

非阻塞同步:在并发环境下,某个线程对共享变量先进行操作,如果没有其他线程争用共享数据那操作就成功;如果存在数据的争用冲突,那就才去补偿措施,比如不断的重试机制,直到成功为止,因为这种乐观的并发策略不需要把线程挂起,也就把这种同步操作称为非阻塞同步(操作和冲突检测具备原子性)。

在硬件指令集的发展驱动下,使得 "操作和冲突检测" 这种看起来需要多次操作的行为只需要一条处理器指令便可以完成,这些指令中就包括非常著名的CAS指令(Compare-And-Swap比较并交换)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值