java locks包下提供的锁。
来源:互联网 发布:网络主播毒药黄播 编辑:程序博客网 时间:2024/06/07 05:10
Java 并发包concurrent包下主要提供lock和ReadWrite两种接口,提供两种类型的锁。
1.ReentrantLock类
由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
等待可中断
持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。公平锁
多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。锁绑定多个条件
一个ReentrantLock对象可以同时绑定对个对象,阻塞队列(BlockingQueue)就是基于lock的多条件实现的,可以查看Java并行编程-lock中使用多条件condition(生产者消费者模式实例)。
ReentrantLock(可重入锁)实现lock接口。常用的方法有lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()是用来获取锁的。unLock()方法
是用来释放锁的。
lock():尝试获取获取锁,如果成功立即返回,如果不成功进入休眠。
tryLock():尝试获取锁,不管成功与否,立即返回true/false(这也是lock比Synchronized更灵活)。
tryLock(long time, TimeUnit unit):与tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。
lockInterruptibly():方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态,所以lock是可中断的。
使用例如如下,一定要在finally中unlock(),避免发生异常时出现死锁.
public class SynDemo{ public static void main(String[] arg){ Runnable t1=new MyThread(); new Thread(t1,"t1").start(); new Thread(t1,"t2").start(); }}class MyThread implements Runnable { private Lock lock=new ReentrantLock(); public void run() { lock.lock(); try{ for(int i=0;i<5;i++) System.out.println(Thread.currentThread().getName()+":"+i); }finally{ lock.unlock(); } }}
2.ReentrantReaderWriteLock类。
ReentrantReaderWriteLock实现的是ReadWriteLock接口,用法与ReentrantLock相似。读写锁把锁分为读锁和写锁,能提高并发的效率,长用在读数据比较多,写数据比较少的场景。
readLock():获取读锁,不会造成阻塞。
writeLock():获得写锁,写的时候阻塞读线程和写线程。
如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁。
如果有一个线程已经占用了写锁,则此时其他线程如果申请写锁或者读锁,则申请的线程会一直等待释放写锁。
对ReentrantLock的源码分析这有一篇很好的文章http://www.blogjava.net/zhanglongsr/articles/356782.html
对读写锁的使用场景: http://blog.csdn.net/it_man/article/details/8972001
关于锁的详细使用可以查看这篇文章:http://www.cnblogs.com/dolphin0520/p/3923167.html
- java locks包下提供的锁。
- Java多线程总结(8)concurrent.locks包下的锁机制的使用
- java.util.concurrent.locks包
- 发编程包的java.util.concurrent.locks
- Java并发基础(八)-locks包
- 关于concurrent的子包locks下reentrantReadwritelock的一点疑惑
- 关于concurrent的子包locks下reentrantReadwritelock的一点疑惑(第二篇)
- concurrent.locks包中的几种锁的区别
- Java多线程总结(7)synchronized的缺陷及concurrent.locks包类结构简介
- 《Java提供的部分常用包》
- Java提供的部分常用包
- java源码(一) java.util.concurrent.locks 包 详解
- CIFS 下opportunistic locks(机会锁)
- java.util.concurrent.locks 并发包介绍【1】
- 【java总结】多线程进阶篇之locks包
- java.util.concurrent.locks lock锁【2】
- Java基础——Locks锁机制
- 测试java.swing包提供的轻量级组件的例子
- 基础排序算法(Java实现)
- java.pojo工具类
- 简单说说TCP(3) --- 断开连接四次握手
- Codeforces 584D Dima and Lisa 【数学】
- 架构高性能网站秘笈(一)——了解衡量网站性能的指标
- java locks包下提供的锁。
- jQuery Ajax 实例 ($.ajax、$.post、$.get)
- CMM小结2
- Android 省市区的树节点控件
- MainWindow.h
- Java 将多个连续的换行符替换成一个换行符
- yii模块化安装简易过程
- php生成excel方法二
- checkpoint、cache fusion、OCR、GCS、GES、GRD、负载均衡、srvctl命令