1. ReentrantLock类

ReentrantLock可以实现线程之间同步互斥,类似于synchronized同样的效果。

public class ThreadReentrantLock {public static void main(String[] args) {ThreadA threadA = new ThreadA();for (int i = 0; i < 3; i++) {Thread th = new Thread(threadA);th.setName("Thread" + i);th.start();}}static class ThreadA extends Thread {private Lock lock = new ReentrantLock();public void run() {System.out.println(currentThread().getName() + " run");try {lock.lock();System.out.println(currentThread().getName() + " begin");Thread.sleep(1000);System.out.println(currentThread().getName() + " end");} catch (InterruptedException e) {} finally {lock.unlock();}}}
}

输出

2. Condition实现wait/notify功能

主要方法

  • await()相当于wait()方法
  • await(long time, TimeUnit unit)相当于wait(long)方法
  • signal()相当于notify()方法
  • signalAll()相当于notifyAll()方法

await()signal()同样需要在lock.lock()之后调用,否则会报监视器出错。

public class ThreadCondition {public static void main(String[] args) {try {ThreadA threadA = new ThreadA();threadA.start();Thread.sleep(3000);threadA.singal();} catch (InterruptedException e) {}}static class ThreadA extends Thread {private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void run() {         try {lock.lock();System.out.println("ThreadA begin await " + System.currentTimeMillis());condition.await();System.out.println("ThreadA end await " + System.currentTimeMillis());} catch (InterruptedException e) {} finally {lock.unlock();}}public void singal() {lock.lock();System.out.println("ThreadA begin signal " + System.currentTimeMillis());condition.signal();System.out.println("ThreadA end signal " + System.currentTimeMillis());lock.unlock();}}
}

输出

3. ReentrantLock方法

  • getHoldCount()查询当前线程保持此锁的个数,也就是调用lock()方法的次数。
  • getQueueLength()返回正等待获取此锁定的线程数。
  • getWaitQueueLength(Condition condition)返回等待与此锁相关的给定条件Condition的线程数。
  • hasQueuedThread(Thread thread)查询指定的线程是否正在等待获取此锁。
  • hasQueuedThreads()查询是否有线程正在等待获取此锁。
  • hasWaiters(Condition condition)查询是否有线程正在等待与此锁有关的给定条件Condition
  • isFair()判断是否是公平锁。
  • isHeldByCurrentThread()查询当前线程是否保持此锁。
  • isLocked()查询此锁是否由任意线程保持。
  • lockInterruptibly()当前线程未被中断,则获取锁定,如果中断则出现异常。
  • tryLock()仅在当前锁未被另一个线程保持的情况下,才能获得该锁。
  • tryLock(long timeout, TimeUnit unit)仅在给定等待时间内没有被另一线程保持,且当前线程未被中断,才能获得该锁。

4. ReentrantReadWriteLock读写锁

读写锁有两个锁,一个是读操作相关的锁,称为共享锁。另一个写操作相关的锁,叫排它锁。多个读锁之间不互斥,而读锁与写锁、写锁与写锁之间互斥。

public class ThreadReentrantReadWriteLock {  private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();public void read() {try {lock.readLock().lock();System.out.println(Thread.currentThread().getName()+ " read " + System.currentTimeMillis());Thread.sleep(1000);} catch (InterruptedException e) {} finally {lock.readLock().unlock();}}public void write() {try {lock.writeLock().lock();System.out.println(Thread.currentThread().getName()+ " write " + System.currentTimeMillis());Thread.sleep(1000);} catch (InterruptedException e) {         } finally {lock.writeLock().unlock();}}static class WriteThread extends Thread {private ThreadReentrantReadWriteLock service;public WriteThread(ThreadReentrantReadWriteLock service) {this.service = service;}public void run() {service.write();}}static class ReadThread extends Thread {private ThreadReentrantReadWriteLock service;public ReadThread(ThreadReentrantReadWriteLock service) {this.service = service;}public void run() {service.read();}}
}

调用两个读操作,两者几乎同时运行

public static void main(String[] args) {ThreadReentrantReadWriteLock service = new ThreadReentrantReadWriteLock();ReadThread readThread1 = new ReadThread(service);readThread1.setName("ReadThread1");readThread1.start();ReadThread readThread2 = new ReadThread(service);readThread2.setName("ReadThread2");readThread2.start();
}

输出

调用一个读、一个写操作,同一时间只允许一种操作

public static void main(String[] args) {ThreadReentrantReadWriteLock service = new ThreadReentrantReadWriteLock();WriteThread writeThread = new WriteThread(service);writeThread.setName("WriteThread");writeThread.start();ReadThread readThread = new ReadThread(service);readThread.setName("ReadThread");readThread.start();
}

输出

相关文章
Java wait和notify方法
Java Thread.join方法
Java Thread.sleep方法
Java Thread.Interrupt方法
Java Lock对象

Java Lock对象相关推荐

  1. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  2. Java:使用synchronized和Lock对象获取对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制. 1.对象的锁 所有对象都自动含有单一的锁. JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁 ...

  3. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  4. java static 对象加锁_java安全编码指南之:lock和同步的正确使用

    简介 在java多线程环境中,lock和同步是我们一定会使用到的功能.那么在java中编写lock和同步相关的代码之后,需要注意哪些问题呢?一起来看看吧. 使用private final object ...

  5. java lock代码写法_java Lock接口详解及实例代码

    java  lock接口 java.util.concurrent.locks 接口lock public interface loce loce实现提供了比使用synchronized方法和语句可获 ...

  6. [Java] [Lock] [Synchronized VS ReentrantLock]

    Overview java编写多线程程序时,为了保证线程安全,需要对数据进行同步,经常用到的两种同步方式就是synchronized和重入锁ReentrantLock. 相似点 都是加锁方式 都是阻塞 ...

  7. 使用synchronized和Lock对象获取对象锁

     Java:使用synchronized和Lock对象获取对象锁 下面使用ReentrantLock这个锁来实现加锁功能: package com.tch.test.concurrent;import ...

  8. 类锁 synchronized对象锁 和 Lock对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制. 对象锁 所有对象都自动含有单一的锁. JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁的时候 ...

  9. Java的对象监视器和Condition监视器概念以及对比

    详细介绍了Java对象监视器的概念以及API方法,包括JDK1.5提供的Condition监视器对比. 文章目录 1 对象监视器 1.1 方法 1.2 特点 2 Condition 监视器 2.1 O ...

最新文章

  1. vuepress 跑不起来?报错?空白页? res.getHeader is not a function?
  2. 【PC工具】Windows10开始菜单增强工具Stardock Start10
  3. RecyclerView的那点事儿
  4. FZU 1894 志愿者选拔
  5. php记录已经点击过,最近一次的PHP面试题记录,office已到手!
  6. 老司机找BUG指南,赶紧拿走。。
  7. Kung Fu Panda: Legends of Awesomeness 2
  8. FPGA入门到精通系列1:数字电路基础知识
  9. Keystore and keytool information
  10. 360p2刷无线打印服务器,【联网版】360路由器P2刷tomato固件小白教程
  11. Android开源库——xUtils框架
  12. OPENSSL中RSA私钥文件(PEM格式)解析【一】
  13. 电流继电器的分类和原理
  14. 魔兽和星际的最大差别
  15. 从学员角度体验教练技术之考驾照
  16. 张柏芝、谢霆锋、陈冠希近半年行踪关系图,这个图很厉害,可以作为思维导图的工具...
  17. 使用计算机翻译功能吗,微信上怎么使用翻译功能 翻译功能设置教程
  18. 算法分析与设计(VC问题团问题独立集问题)
  19. 关于Macbook Pro/Air 键盘输入乱码,重置NVRAM无效
  20. java 判断日期是同一天_java判断两个日期是否同一天的方法

热门文章

  1. 【Bio】基础生物学 - 蛋白质变性 protein denaturation,细胞分化 cellular differentiation
  2. 112页PPT | 元宇宙的技术构成与未来展望(附下载)
  3. 思科云服务器是干什么的,思科的服务器困局:投资增长,还是退出?
  4. 从0开始学习blockchain
  5. zbrush2019稳定版+超多笔刷合集
  6. 服务器物理碰撞检测,一种在服务器端实现三维游戏碰撞检测的方法
  7. 修改服务器核心数,Windows Server 2016授权模式大调整,改用处理器核心计价
  8. scrollTop详测
  9. HTML5响应式手机模板:电商网站设计——歪秀商城手机端开发静态页面HTML+CSS+JavaScript 手机模板wap 手机网站模板 企业手机网站模板
  10. C++ ifstream