美文网首页
Lock源码解读

Lock源码解读

作者: 小锋_c3c2 | 来源:发表于2019-11-29 00:01 被阅读0次

Lock接口

public interface Lock {

// 获得锁资源

void lock();

// 尝试获得锁,如果当前线程被调用了interrupted则中断,并抛出异常,否则就获得锁

void lockInterruptibly() throws InterruptedException;

// 判断能否获得锁,如果能获得,则获得锁,并返回true(此时已经获得了锁)

boolean tryLock();

// 保持给定的等待时间,如果期间能拿到锁,则获得锁,同样如果期间被中断,则抛异常

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

// 释放锁

void unlock();

// 返回与此Lock对象绑定Condition实例

Condition newCondition();

}

public interface Condition {

// 让当前线程等待,直到被通知或者被中断

void await() throws InterruptedException;

// 与前者的区别是,当等待过程中被中断时,仍会继续等待,直到被唤醒,才会设置中断状态

void awaitUninterruptibly();

// 让当前线程等待,直到它被告知或中断,或指定的等待时间已经过。

boolean await(long time, TimeUnit unit) throws InterruptedException;

// 与上面的类似,让当前线程等待,不过时间单位是纳秒

long awaitNanos(long nanosTimeout) throws InterruptedException;

// 让当前线程等待到确切的指定时间,而不是时长

boolean awaitUntil(Date deadline) throws InterruptedException;

// 唤醒一个等待当前condition的线程,有多个则随机选一个

void signal();

// 唤醒所有等待当前condition的线程

void signalAll();

}

public interface ReadWriteLock {

// 返回写锁

Lock writeLock();

// 返回读锁

Lock readLock();

}

class CachedData {

Object data;

volatile boolean cacheValid;

final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

void processCachedData() {

// 获得写锁

rwl.readLock().lock();

// 缓存无效,则重写数据

if (!cacheValid) {

// 在获得写锁之前,必须先释放读锁

rwl.readLock().unlock();

rwl.writeLock().lock();

try {

// 重写检查一次,因为其他线程可能在这段时间里获得了写锁,并且修改了状态

if (!cacheValid) {

data = ...

cacheValid = true;

}

// 在释放写锁之前,通过获取读锁来降级。

rwl.readLock().lock();

} finally {

// 释放写锁

rwl.writeLock().unlock();

}

}

// cacheValid,直接获取数据,并释放读锁

try {

use(data);

} finally {

rwl.readLock().unlock();

}

}

}

相关文章

网友评论

      本文标题:Lock源码解读

      本文链接:https://www.haomeiwen.com/subject/lsxwwctx.html