Lock接口
锁是用来控制多个线程访问共享资源的方式。一个锁能够防止多个线程同时访问共享资源。Lock接口出现之前,Java靠synchronized关键字来实现锁功能。Java SE5之后,新增Lock接口实现锁的功能。提供了和synchronized相似的同步功能。需要显式的获取释放锁。
Lock的使用方式:
Lock lock = new ReentrantLock();
lock.lock();
try {
} finally {
lock.unlock();
}
finally中释放锁,保证在获取锁之后能够被最终释放。不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放。
队列同步器
AbstractQueuedSynchronizer是用来构建锁和其他同步组件的基础架构,它使用一个int成员来表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。
锁是面向使用者的,定义了使用者和锁交互的接口,隐藏了实现细节;同步器是面向锁的实现者,简化了锁的实现方式。屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作
重入锁
支持重进入的锁。表示该锁能够支持一个线程对资源的重复加锁。该锁也支持公平和非公平的选择。
重进入是指任意线程在获取锁之后能够再次获取该锁而不会被锁阻塞。
实现重进入需要解决的问题:
1、线程再次获取锁
2、锁的释放
读写锁
读写锁可以在同一时刻被多个读线程访问。但是在写线程访问时,其他读和写线程都被阻塞。读写锁维护了一对锁,一个读锁和一个写锁。通过分离读锁和写锁,并发性比其他的排它锁有提升。
在读操作时获取读锁,在写操作时获取写锁。当写锁被获取到的时候,后续读写操作都会被阻塞。在写锁释放以后,,所有操作继续执行。
网友评论