Lock的实现原理

两种加锁方式:

Synchronized(obj){do logic}:尝试获取obj的锁,如果无法获取则阻塞等待;

Lock:它的实现原理和Synchronized完全不同,它使用compare and swap理念,如果符合cas判定逻辑,那么就修改state状态,把当前线程设定为独占,具体代码为:

/**
* Performs lock. Try immediate barge, backing up to normal
* acquire on failure.
*/
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}


无法获取锁的话,那么就:

public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}


但是为啥tryAcquire直接抛出异常说UnsupportedOperationException呢,不明白

protected boolean tryAcquire(int arg) {
throw new UnsupportedOperationException();
}


Lock很重要的一个方面是它可以tryLock,试图获取不成的话可以不用阻塞,Synchronized的话那就等吧,等着cpu调度到你这个线程,你就可以做事了。

AtomicInteger实现原子性的原理如下:

/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}


一、get()获取的是本地private volatile int value,这样保证可见性;
二、如果内存中的值是current,则设置为next
三、如果if (compareAndSet(current, next))返回false,看到for (;;)了吗?其他线程修改完了不就等到我了吗,O(∩_∩)O哈哈~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值