java锁的介绍

java中的锁
锁使用来控制共享资源的方式,一般来来说,一个锁能够防止多个线程同时访问共享资源,在lock接口之前,java程序
是靠synchronized 关键字来实现锁的功能的,而javase 5 之后,并发包新增了lock接口来实现相关功能,
Lock接口提供的synchronized关键字不具备的主要特性
特性:尝试非阻塞获取锁:当前线程获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取锁并持有锁
能够不断地获取锁: 与synchronized不同,获取锁的线程能够响应中断,当获取到锁的线程被中断时,中断
异常将会被抛出,同时锁会被释放
超时获取锁:指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回
队列同步器
队列同步器AbstractWueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量
表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作
队列同步器的接口与实例

public class TestLock implements Lock {
//自定义同步器
private static class Sync extends AbstractQueuedSynchronizer{
//是否处于占用状态
@Override
protected boolean isHeldExclusively() {
return getState()==1;
}
//当状态为0时获取锁
@Override
protected boolean tryAcquire(int arg) {
if(compareAndSetState(0,1)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
//释放锁 将状态设置为0
@Override
protected boolean tryRelease(int arg) {
if (getState()==0) throw new IllegalArgumentException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
//每个condition都包含一个conditon队列
Condition newCondition(){
return new ConditionObject();
}
}
//将操作设置到代理上
private final Sync sync =new Sync();
@Override
public void lock() {
sync.acquire(1);
}

@Override
public void lockInterruptibly() throws InterruptedException {
    sync.acquireInterruptibly(1);
}

@Override
public boolean tryLock() {
    return false;
}

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
    return sync.tryAcquire(1);
}

@Override
public void unlock() {
    sync.release(1);
}

@Override
public Condition newCondition() {
    return sync.newCondition();
}

}
队列同步器的分析与实现
依赖内部的同步队列来完成同步状态的管理,当前线程获取同步状态是失败时,同步器会将当前线程以及等待状态等
信息构成为一个节点并将其加入同步队列,同时会阻塞当前线程,同步释放状态时,会把首节点中的线程唤醒,使其
再次获取同步状态。
int waitStatus: Cancelled 值为1,由于同步状态中等待的超时或者被中断,需要从同步队列取消等待,节点进入
该状态不会发生变化。
signal:值为-1,后续节点的线程处于等待状态,而当前节点释放了同步状态或者被取消,将会通知后继节点,使
后继节点的线程的得以运行
conditon:值为-2,节点在等待队列
propagate:值为-3,表示下一次共享同步状态将会无条件地被传播下去
inital,值为0,初始状态
独占式同步状态获取与释放
通过同步器的acquire(int arg)方法获取同步状态,该方法对中断不敏感,也就是由于线程获取同步状态失败后
则进入同步队列中,后续对线程中断操作是,线程不会从同步队列中移出
重入锁
从进入是指任意线程在获取锁之后能够再次获取该锁而不会被阻塞
线程再次获取锁
锁的最终释放
公平锁与非公平锁的区别
锁的顺序就该符合请求绝对时间顺序
读写锁
参考方腾飞老师的《并发编程艺术》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章