java读写锁的特性

图片[1]-java读写锁的特性-uusu优素-乐高,模型,3d打印,编程

1、公平选择性,支持非公平和公平锁获取,吞吐量不公平优于公平。

2、重进入,读锁和写锁都支持线程重进入。

3、锁降级,遵循获取写锁、获取读锁、释放写锁的顺序,写锁可以降级为读锁。

实例

publicclassReadWriteLockTest{
publicstaticvoidmain(String[]args){

finalQueueq=newQueue();

for(inti=0;i<3;i++){

newThread(){
@Override
publicvoidrun(){

while(true){
q.get();
}
}
}.start();

newThread(){
@Override
publicvoidrun(){
while(true){
q.put(newRandom().nextInt(10000));
}
}
}.start();
}
}
}

classQueue{

//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
ReadWriteLockrwl=newReentrantReadWriteLock();
privateObjectdata=null;//共享数据,只能有一个线程能写数据,但可以有多个线程读该数据

publicvoidget(){
//上读锁,其他线程只能读不能写
rwl.readLock().lock();
try{

System.out.println(Thread.currentThread().getName()+"bereadytoreaddata!");
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName()+"havereaddata:"+data);
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
rwl.readLock().unlock();
}
}

publicvoidput(Objectdata){
//上写锁,不允许其他线程读也不允许写
rwl.writeLock().lock();

try{
System.out.println(Thread.currentThread().getName()+"bereadytowritedata!");

Thread.sleep((long)(Math.random()*1000));

this.data=data;
System.out.println(Thread.currentThread().getName()+"havewritedata:"+data);
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
rwl.writeLock().unlock();
}
}
}
原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容