重入锁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之间是不排斥的, 这使得"读线程"绝对的并行, 适合用在读高发的场合
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
- 重入锁--ReentrantLock
- 重入锁--ReentrantLock
- 重入锁ReentrantLock
- 重入锁ReentrantLock
- 重入锁--ReentrantLock
- 重入锁--ReentrantLock
- ReentrantLock 重入锁
- 重入锁ReentrantLock
- ReentrantLock重入锁
- 重入锁--ReentrantLock
- 重入锁ReentrantLock
- ReentrantLock重入锁
- ReentrantLock重入锁
- ReentrantLock(重入锁)以及公平性
- ReentrantLock(重入锁)以及公平性
- ReentrantLock(重入锁)以及公平性
- ReentrantLock(重入锁)以及公平性
- Java重入锁ReentrantLock
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- 怎么删除Xcode的缓存
- memcached 一致性hash算法 - consistent hashing
- HDU 2099 -- 整除的尾数
- 为Xcode6 添加预编译文件 .pch
- 重入锁ReentrantLock
- 开源框架IIViewDeck使用
- Android应用基础——Activity
- 第二十五章 异常处理
- 20.替换空格
- PB获取图片文件原始大小的API函数
- Linux-计算机概论
- latest售票
- void main 与int main的区别