java多线程知识总结(三)

Lock接口

lock锁和Synchronized锁都能够达到线程同步的目的,但是lock锁还可以显示的获取对象和释放锁,而且Synchronized则是隐式的。

lock接口提供的Synchronized关键字不具备的特性:

(1)会尝试非阻塞的获取锁

当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁

(2)能被中断的获取锁

与Synchronized锁不同,获取到锁的线程能响应中断,当获取锁的线程中断时,中断异常将会被抛出,同时锁会被释放。

(3)超时获取锁

在指定截止时间之前获取锁,如果截止时间到了仍旧无妨获取锁,则返回

lock包下的类:

AbstractOwnableSynchronizer、AbstractQueuedLongSynchronizer、AbstractQueuedSynchronizer、Condition、Lock、LockSupport、ReadWriteLock、ReentrantLock、ReentrantReadWriteLock、StampedLock

Lock接口的主要实现有:ReentranLock,其中ReentranLock中使用到了AbstractQueuedSynchronizer(队列同步器)

Lock接口的定义:

void lock():获取锁,调用该方法啊,当前线程将会获取锁,当锁获得后,从该方法返回

void lockInterruptibly():课中断的获取锁,和lock()方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程。

Boolean tryLock():尝试非阻塞的获取锁,调用该方法后立即返回,如果能获取则返回为true,否则返回false。

Boolean tryLock(long time,TimeUnit unit):超时的获取锁,当前线程在以下三种情况下会返回true:

1.当前线程在超时时间内获取了锁

2.当前线程在超时时间内被中断

3.超时时间结束返回为false

void unlock():释放锁

Condition newCondition():获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait方法,而调用后,当前线程将释放锁。

队列同步器:

队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO(先进先出)队列来完成资源获取线程的排队工作。

含义如下:

(1)如果我们使用同步锁共享变量的时候,我们首先应该知道这个共享变量的状态,比如是否已经被其它线程锁住,这也是这个int成员变量的作用。

(2)既然是同步访问共享资源,肯定会有一些线程无法获取到共享资源等待获取锁从而进入一个容器中进行保存,而这个容器就是FIFO队列。

猜你喜欢

转载自www.cnblogs.com/loveConan5----/p/9747868.html