多线程之加锁

常用的加锁方式

1、Synchronized

2、ReentrantLock

try {

      lock.lock();

} finaly {

    lock.unlock();

下面看下源码,构造函数中默认是非公平锁,也可传入true变成公平锁,下面对比下非公平锁与公平锁过程

 

2、调用lock方法

 

 

可以看出非公平锁第一步是尝试更改state状态,如果更改成功则直接把当前线程赋值给独占线程,再看acquire

线程以独占模式生成节点,addWaiter会 将新生成的节点prev执行tail,并通过CAS将tail.next 指向新生成的节点,如果CAS失败,则一直循环下去

 

子类必须重写该方法,否则就会抛出异常

 

如果state = 0说明线程已经释放锁直接尝试能否CAS操作,如果与当前线程相同(可重入锁)再加1,所以lock与unlock必须同时出现

 

 

当前线程阻塞

当unlock时

3、AtomicInteger

https://baijiahao.baidu.com/s?id=1647621616629561468&wfr=spider&for=pc

 

4、读写锁

https://www.jianshu.com/p/9cd5212c8841

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值