重入锁ReentrantLock

来源:互联网 发布:linux怎么查看ntp进程 编辑:程序博客网 时间:2024/05/01 06:54
一. ReentrantLock
 1)重入锁提供了细粒度的控制
    lock() : 获取锁, 若获取失败, 线程等待, 自动参与下一轮锁竞争, 直到获取锁进入下面的代码
lockInterruptibly() : 获取锁后, 可响应thread.interrupt()方法, 进入catch异常的代码块. 该方法还呢过中断Thread.sleep(), wait()
tryLock() : 返回boolean, 尝试获取锁. 若获取成功, 给该线程加锁. 若获取失败, 不让线程等待, 返回false进行下面的代码
unlock() : 释放对象锁 (unlock释放锁, 但是不会唤醒synchronized内的wait(). 重入锁和同步锁不能混用)
 2)重入锁的构造函数
    new Reentrantck( boolean  fair) : 公平锁维护一个先入先出的队列,保存线程. 效率慢. 非公平所自动进行锁竞争
二. ReentrantReadWriteLock
 1)ReentrantReadWriteLock和重入锁是同级别的类,他把锁进行了锁层级上的分类,分为ReadLock,WriteLock
 2)ReadLock,WriteLock是ReentrantReadWriteLock的内部类,他们维护的是同一个锁对象ReentrantReadWriteLock
 3)ReadLock之间是不排斥的, 这使得"读线程"绝对的并行, 适合用在读高发的场合
public class AA extends Thread{//public final ReentrantLock lock = new ReentrantLock();public final ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();ReadLock lock = rwlock.readLock();//ReadLock,WriteLock是ReentrantReadWriteLock的内部类,这两个锁是所层面的抽象,他们维护的是同一个锁WriteLock wlock = rwlock.writeLock();  public  void say1(){while(true){try {lock.lockInterruptibly(); //响应中断后进入catch块Thread.sleep(200);System.out.println("aaaaa");} catch (InterruptedException e) {System.out.println("响应中断");System.exit(0);}finally{lock.unlock();//finally中释放锁}}}public  void say2(){while(true){lock.lock();try {Thread.sleep(200);System.out.println("b");} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();}}}}public class TestAA {public static void main(String[] args) throws InterruptedException {final AA a = new AA(); new Thread(){@Overridepublic void run() {a.say2();}}.start();Thread t2 = new Thread(){@Overridepublic void run() {a.say1();}};t2.start();Thread.sleep(2000);t2.interrupt(); // t2.interrupted():测试t2线程是否中断}/**重入锁    /** 重入读写锁  b<span style="white-space:pre"></span>baaaaaaaaaabbb响应中断bbaaaaaaaaaaaaaaaaaaaa响应中断 */}

0 0