美文网首页
Java中Lock接口介绍

Java中Lock接口介绍

作者: 在岁月中远行 | 来源:发表于2022-06-12 19:26 被阅读0次

在java多线程编程中,我们经常使用synchronized关键字来实现同步,控制多线程对变量的访问,来避免并发问题。

但是有的时候,synchronized关键字会显得过于沉重,不够灵活。

1、效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程。

2、不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的。

3、无法知道是否成功获取到锁。

这个时候Lock接口出现。Lock不是java中的关键字而是一个java.util.concurrent.locks包中的一个接口。下面我们简单介绍一下Lock接口。

一 Lock接口简介

Lock实现提供了比使用synchroized方法和语句可以获得的更广泛的锁定操作,此实现允许更灵活的结构,还可以支持多个相关的Condition对象。

Lock lock=new ReentrantLock();

        lock.lock();

        try {

            //业务代码

        }finally {

            lock.unlock();

        }

锁的锁定和释放如果在不同的模块时,需要小心编码,确保最后锁一定能得到释放。

二 Lock接口中定义的方法

1 void lock()

获取锁,如果锁不可用,出于线程调用目的,将禁用当前线程,并且在获取锁之前,该线程一直处于休眠状态。

2 void lockInterruptibly() 如果当前线程未被中断,则获取锁。

3 Condition newCondition() 返回绑定到此Lock实例的新Condition实例。

4 boolean tryLock()仅在调用锁为空闲状态才获取锁,如果锁可用,则获取锁,并立即返回值为true,如果锁不可用,则此方法立即返回值为false。

5 boolean tryLock(long time,TimeUnit unit) 如果锁在给定的的等待时间内空闲,并且当前线程未被中断,则获取锁。

6 void lock() 释放锁,在等待条件前,锁必须由当前线程保持,

三 实现类 ReentrantLock

Lock接口有三个实现类ReentrantLock,ReentrantLockReadWirteLock.ReadLock,

ReentrantLockReadWirteLock.WriteLock。后面两个是内部类。

其中一个ReentrantLock,在我们平常中使用更为频繁。

是一个可重入的互斥锁Lock,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

ReentrantLock的构造方法接受一个可选的公平参数,当设置为true时,在多个线程的竞争下,这些锁倾向于将访问权授予等待时间最长的线程,否则此锁将无法保证访问顺序,公平锁也只是趋向公平,并不能完全保证。

ReentrantLock类中还定义了Lock接口之外的方法,例如int getHoldCount(),boolean hasQueuedThreads(),boolean hasWaiters(Condition condition)等等,这些方法可以查询锁的状态。

下面我们用Lock简单实现下多线程的一个同步,新建5个线程一次打印奇偶数,实现了线程按照顺序来执行。先看运行结果。

主要代码如下:

相关文章

网友评论

      本文标题:Java中Lock接口介绍

      本文链接:https://www.haomeiwen.com/subject/pnvgmrtx.html