栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发编程Lock的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发编程Lock的使用

该篇文章主要内容:

  1. ReentrantLock类的使用
  2. ReentrantReadWriteLock类的使用
1.1: 使用ReentrantLock类

ReentrantLock类可以认为是synchronized的升级版,在synchronized实现线程之间的同步互斥功能外,还具有嗅探锁定,多路分支通知等功能,而且在使用上也比synchronized更加灵活。

1.1.1:使用ReentrantLock类进行同步

实例1:


实例二:
仅修改Test类

1.1.2:使用Condition实现等待/通知

Lock相比与synchronized关键字的wait、notify()和notifyAll,它更加的灵活,比如可以实现多路通知功能,即可以在一个Lock对象里面创建多个Condition(对象监视器)实例,线程对象可以注册在指定Condition中,从而可以有选择性地进行线程通知。


注:如果在释放锁之前出现错误,并不会释放锁,所以最好在finally块中释放锁.
Object类中的wait()方法相当与Condition类中的await方法。
Object类中的wait(long timeout)方法相当与Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当与Condition类中的signal()方法。
Object类中的nodifyAll()方法相当与Condition类中的signalAll()方法。



1.1.3: 实现多生产者/消费者

Service类

package com.zjw;

import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Service {
    private ReentrantLock lock=new ReentrantLock();
    private ArrayList list=new ArrayList<>();
    private int i=0;
    private ReentrantLock lock2=new ReentrantLock();
    private Condition condition1=lock.newCondition();
    private Condition condition2=lock.newCondition();
    public void setValue(){
        try{
            lock.lock();
            while(list.size()==5){
                condition1.await();
            }
            System.out.println("我是生产者"+Thread.currentThread().getName()+i);
            list.add(i++);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            condition2.signal();
            lock.unlock();
        }
    }
    public void getValue(){
        try{
            lock.lock();
            while(list.size()==0){
                condition2.await();
            }
            int j=list.remove(0);
            System.out.println("我是消费者"+Thread.currentThread().getName()+j);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            condition1.signal();
            lock.unlock();
        }
    }
}

1.1.4: ReentrantLock类的一些其它方法

1、int getHoldCount() :查询当前线程保持此锁定的个数,即调用lock()方法的次数
2、int getQueueLength():返回正等待获取此锁定的线程估计数,比如5个线程,一个调用await()方法,则使用该方法返回值为4,因为有4个线程正同时等待lock的释放。
3、int getWaitQueueLength(Condition condition):返回执行给定condition后锁定的线程数,假设5个线程,3个使用了给定condition的await()相关方法,则返回值为3.
4、boolean hasQueuedThread(Thread thread):是查询指定的线程是否正在等待获取此锁定。
5、boolean hasQueuedThreads(): 查询是否有线程正在等待获取此锁定。
6、boolean hasWaiters(Condition condition):查询是否有线程正在等待此锁定的Condition的signal唤醒。
7、boolean isFair():判断该锁是不是公平锁,默认是非公平锁。
8、boolean isHeldByCurrentThread(): 查询当前线程是否保持此锁定。
9、boolean isLocked(): 查询该锁是否有线程持有。
10、boolean tryLock()与tryLock(long timeout,TimeUnit unit):是尝试获取锁,参数则表示在该时间内尝试,如果没有获取,则放弃获取锁。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号