java.util.concurrent包下的一些跟锁相关的类列表

 类  简介
locks.Lock接口

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

所有已知实现类:ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

方法包括:

void lock()
          获取锁。
void unlock()
          释放锁。
locks.Condition newCondition()
          返回绑定到此 Lock 实例的新 Condition
实例。
boolean tryLock()
          仅在调用时锁为空闲状态才获取该锁。
boolean tryLock(long time, TimeUnit unit)
          如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
void lockInterruptibly()
          如果当前线程未被中断,则获取锁。
locks.ReentrantLock类
public class ReentrantLock extends Object implements Lock, Serializable

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

可以实现公平锁,默认为非公平锁。

构造函数:

ReentrantLock()
          创建一个 ReentrantLock 的实例(非公平锁)。
ReentrantLock(boolean fair)
          创建一个具有给定公平策略的 ReentrantLock

常用方法:

Lock接口上定义的那些方法 + 下面表中的查询方法

int getHoldCount()
          查询当前线程保持此锁的次数。
protected  Thread getOwner()
          返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null
protected Collection<Thread> getQueuedThreads()
          返回一个 collection,它包含可能正等待获取此锁的线程。
int getQueueLength()
          返回正等待获取此锁的线程估计数。
protected  Collection<Thread> getWaitingThreads(Condition condition)
          返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
int getWaitQueueLength(Condition condition)
          返回等待与此锁相关的给定条件的线程估计数。
boolean hasQueuedThread(Thread thread)
          查询给定线程是否正在等待获取此锁。
boolean hasQueuedThreads()
          查询是否有线程正在等待获取此锁。
boolean hasWaiters(Condition condition)
          查询是否有些线程正在等待与此锁有关的给定条件。
boolean isFair()
          如果此锁的公平设置为 true,则返回 true
boolean isHeldByCurrentThread()
          查询当前线程是否保持此锁。
String toString()
    
返回标识此锁及其锁定状态的字符串。
locks.ReadWriteLock接口

ReadWriteLock 维护了一对相关的,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。

所有已知实现类:locks.ReentrantReadWriteLock

Lock readLock()
          返回用于读取操作的锁。
Lock writeLock()
          返回用于写入操作的锁。

locks.

ReentrantReadWriteLock

public class ReentrantReadWriteLock extends Object implements ReadWriteLock, Serializable

该类有如下几个特点:

1、默认为非公平锁模式,可以调用有参的构造函数构建公平锁。

2、可重入:

此锁允许 reader 和 writer 按照 ReentrantLock 的样式重新获取读取锁或写入锁。在写入线程保持的所有写入锁都已经释放后,才允许重入 reader 使用它们。
此外,writer 可以获取读取锁,但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁状态下执行读取操作的方法期间保持写入锁时,重入很有用。如果 reader 试图获取写入锁,那么将永远不会获得成功。

3、锁降级:允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的

示例:

class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
// Recheck state because another thread might have acquired
// write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
rwl.writeLock().unlock(); // Unlock write, still hold read
}
use(data);
rwl.readLock().unlock();
}
}

4、锁获取可中断:读取锁和写入锁都支持锁获取期间的中断。

5、写锁Condition支持,但读锁不支持Condition。

注意事项:此锁最多支持 65535 个递归写入锁和 65535 个读取锁。试图超出这些限制将导致锁方法抛出 Error。

构造函数:

ReentrantReadWriteLock()
          使用默认(非公平)的排序属性创建一个新的 ReentrantReadWriteLock
ReentrantReadWriteLock(boolean fair)
          使用给定的公平策略创建一个新的 ReentrantReadWriteLock

嵌套类:

static class ReentrantReadWriteLock.ReadLock
          readLock()
方法返回的锁。
static class ReentrantReadWriteLock.WriteLock
          writeLock()
方法返回的锁。

主要的方法有:

protected  Thread getOwner()
          返回当前拥有写入锁的线程,如果没有这样的线程,则返回 null
protected  Collection<Thread> getQueuedReaderThreads()

          返回一个 collection,它包含可能正在等待获取读取锁的线程。
protected  Collection<Thread> getQueuedThreads()

          返回一个 collection,它包含可能正在等待获取读取或写入锁的线程。
protected  Collection<Thread> getQueuedWriterThreads()

          返回一个 collection,它包含可能正在等待获取写入锁的线程。
 int getQueueLength()

          返回等待获取读取或写入锁的线程估计数目。
 int getReadHoldCount()

          查询当前线程在此锁上保持的重入读取锁数量。
 int getReadLockCount()

          查询为此锁保持的读取锁数量。
protected  Collection<Thread> getWaitingThreads(Condition condition)

          返回一个 collection,它包含可能正在等待与写入锁相关的给定条件的那些线程。
 int getWaitQueueLength(Condition condition)

          返回正等待与写入锁相关的给定条件的线程估计数目。
 int getWriteHoldCount()

          查询当前线程在此锁上保持的重入写入锁数量。
 boolean hasQueuedThread(Thread thread)

          查询是否给定线程正在等待获取读取或写入锁。
 boolean hasQueuedThreads()

          查询是否所有的线程正在等待获取读取或写入锁。
 boolean hasWaiters(Condition condition)

          查询是否有些线程正在等待与写入锁有关的给定条件。
 boolean isFair()

          如果此锁将公平性设置为 ture,则返回 true
 boolean isWriteLocked()

          查询是否某个线程保持了写入锁。
 boolean isWriteLockedByCurrentThread()

          查询当前线程是否保持了写入锁。
 ReentrantReadWriteLock.ReadLock readLock()

          返回用于读取操作的锁。
 String toString()

          返回标识此锁及其锁状态的字符串。
 ReentrantReadWriteLock.WriteLock writeLock()

          返回用于写入操作的锁。
 CountDownLatch类

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。该类为一次性的锁,不可重用。

构造函数:CountDownLatch(int count)

方法包括:

void await()
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
boolean await(long timeout, TimeUnit unit)
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
void countDown()
          递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
long getCount()
          返回当前计数。
String toString()
          返回标识此锁存器及其状态的字符串。
 CyclicBarrier类

一个同步辅助类,它允许一组线程互相等待(调用await),当等待的线程数达到构造函数中int parties(屏障)的数量时才线程组里的线程才能继续往下执行/退出,同时它有一个带Runnable入参的构造函数允许在线程组突破这个屏障后(但在释放所有线程之前)执行相关的Runnable的代码(也就是最后一个达成突破屏障的那个线程达到后)。该类可重用。

通俗点讲:在hadoop等map/reduce分布式计算框架中里有用到这种思想,将一个任务拆成多个子任务,然后最后一子任务完成后整个任务才能继续往下执行(汇总各个子任务的结果)。

构造函数:

CyclicBarrier(int parties)
          创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动
barrier 时执行预定义的操作。
CyclicBarrier(int parties,
Runnable barrierAction)


          创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动
barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。

方法列表:

int await()
          在所有参与者都已经在此
barrier 上调用 await 方法之前,将一直等待。
 int await(long timeout,
TimeUnit unit)


          在所有参与者都已经在此屏障上调用
await 方法之前将一直等待,或者超出了指定的等待时间。
 int getNumberWaiting()

          返回当前在屏障处等待的参与者数目。
 int getParties()

          返回要求启动此 barrier 的参与者数目。
 boolean isBroken()

          查询此屏障是否处于损坏状态。
 void reset()

          将屏障重置为其初始状态。
 Semaphore类

一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。

通俗的讲就是:一个令牌池,通过acquire()方法获取一个令牌,如果没获取到就等待,获取到了就继续执行,执行完毕通常需要调用release()方法归还令牌,当归还的时候回唤醒正在等待获取令牌的线程来争取这个令牌。

该类默认为非公平锁,但有公平锁的构造函数可选。

构造函数:

Semaphore(int permits)
          创建具有给定的许可数和非公平的公平设置的 Semaphore
Semaphore(int permits,
boolean fair)

          创建具有给定的许可数和给定的公平设置的 Semaphore

方法列表:

void acquire()
          从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断
 void acquire(int permits)

          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断
 void acquireUninterruptibly()

          从此信号量中获取许可,在有可用的许可前将其阻塞。
 void acquireUninterruptibly(int permits)

          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。
 int availablePermits()

          返回此信号量中当前可用的许可数。
 int drainPermits()

          获取并返回立即可用的所有许可。
protected  Collection<Thread> getQueuedThreads()

          返回一个 collection,包含可能等待获取的线程。
 int getQueueLength()

          返回正在等待获取的线程的估计数目。
 boolean hasQueuedThreads()

          查询是否有线程正在等待获取。
 boolean isFair()

          如果此信号量的公平设置为 true,则返回 true
protected
 void
reducePermits(int reduction)

          根据指定的缩减量减小可用许可的数目。
 void release()

          释放一个许可,将其返回给信号量。
 void release(int permits)

          释放给定数目的许可,将其返回到信号量。
 String toString()

          返回标识此信号量的字符串,以及信号量的状态。
 boolean tryAcquire()

          仅在调用时此信号量存在一个可用许可,才从信号量获取许可。
 boolean tryAcquire(int permits)

          仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。
 boolean tryAcquire(int permits,
long timeout, TimeUnit unit)


          如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可。
 boolean tryAcquire(long timeout,
TimeUnit unit)


          如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。

小结java自带的跟锁相关的一些类的更多相关文章

  1. JAVA实现带图片的列表——JList

    JList:显示对象列表并且允许用户选择一个或多个项的组件. JList的构造方法: 1.根据数组创建列表: JList(Object[] listData) 构造一个 JList,使其显示指定数组中 ...

  2. java自带工具-jps、jinfo、jstack、jstat、jmap

    掌握java自带的这些监控工具,有助与我们很好的分析问题和jvm性能调优秀.收集了些网上整理很好的文章. Java监控工具.调优.调试辅助函数 Java自带的GUI性能监控工具Jconsole以及Ji ...

  3. Spark的Straggler深入学习(1):如何在本地图形监控远程Spark的GC情况——使用java自带的jvisualvm

    一.本文的目的       Straggler是目前研究的热点,Spark中也存在Straggler的问题.GC问题是总所周知的导致Straggler的重要因素之一,为了了解GC导致的Straggle ...

  4. java自带BASE64工具进行图片和字符串转换

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  5. Java自带的keytool命令

    使用Java自带的keytool命令,在命令行生成. 1.生成服务器端私钥kserver.keystore文件 keytool -genkey -alias serverkey -validity 1 ...

  6. java发送带附件的邮件

    /** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...

  7. [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用

    PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...

  8. Java 自带MD5加密 Demo

    package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...

  9. java自带的监控工具VisualVM(二)远程监控

    ps:尝试了网上的几个网友提供的方法,始终不得其法,汇总后,终于尝试成功!将一些需要注意的细节也记录下来以后备用! 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目 ...

随机推荐

  1. Linux文本行倒序排列6种方法

    Linux文本行倒序排列6种方法 1. 命令方法: nl filename | sort -nr | cut -f2 这个方法很unix风格,使用多命令组合完成某种功能是典型的unix特点 单命令: ...

  2. 使用idea 在springboot添加本地jar包的方法本地运行有效,一旦需要打jar就会报错,这就需要在

    https://blog.csdn.net/huxiaodong1994/article/details/80702278 1.首先在与src同级的目录下新建一个lib目录,然后将本地jar包放在li ...

  3. Java常见异常(Runtime Exception )小结(转)

    原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示:           本文重在Java中异常机制的一些概念.写本文的目的在 ...

  4. httpd 不带反斜杠 出现 301重定向

    [root@VM_64_69_centos httpd]# curl http://localhost:9001/pay <!DOCTYPE HTML PUBLIC "-//IETF/ ...

  5. java含有静态代码块新建的时候报错java.lang.ExceptionInInitializerError

    问题描述 最近在写一些单元测试用例,为了避免连接外界服务,所有选择mock了数据库Dao层,计划将数据库所需要的数据存在List中,在类加载的时候初始化List并且填充数据.代码如下: public ...

  6. mysqlpump:更加合理的mysql数据库逻辑备份工具

    端看参见就知道了! E:\mysql-8.0.12-winx64>mysqlpump --helpmysqlpump Ver 8.0.12 for Win64 on x86_64 (MySQL ...

  7. JAVA中如何将一个json形式的字符串转为json对象或对象列表

    import java.util.*; import java.text.SimpleDateFormat; import org.json.JSONObject; import org.json.J ...

  8. win7基于mahout推荐之用户相似度计算

    http://www.douban.com/note/319219518/?type=like win7基于mahout推荐之用户相似度计算 2013-12-03 09:19:11    事情回到半年 ...

  9. Overcoming the List View Threshold in SharePoint CAML queries

    From: https://www.codeproject.com/articles/1076854/overcoming-the-list-view-threshold-in-sharepoint- ...

  10. glGetString(GL_VERSION) returns “OpenGL ES-CM 1.1” but my phone supports OpenGL 2

      [问] I'm trying to make an NDK based OpenGL application. At some point in my code, I want to check ...