`

线程并发工具--Lock&Condition

 
阅读更多

Lock和Condition是为了替代synchroinzed、wait、notify的,有点是更面向对象,功能上也更强大。下面是一个简单的例子:

class Outputer {
  Lock lock = new ReentrantLock();
  public void output(String str) {
   lock.lock();
   try{
    for (char c : str.toCharArray()) {
     try {
      Thread.sleep(50);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     System.out.print(c);
    }
    System.out.println();
   }finally{
    lock.unlock();
   }
  }
 }

Lock比传统的synchronzied的优点,除了更面向对象外,它还增加了读写锁的功能。
读写锁的优点是,多个读的线程是仍然可以并发的,仅仅是读和写、写和写之间做同步,这样既提高了读时的效率也保证了写时的安全:

ReentrantReadWriteLock wrl = new ReentrantReadWriteLock();
wrl.readLock().lock();
wrl.readLock().unlock();

wrl.writeLock().lock();
wrl.writeLock().unlock();

读写锁的一个应用是在缓存的实现中,读取缓存的时候先上读锁,然后判断在缓存中是否有数据,如果没有,则需要写,这个时候需要先将读锁解掉,然后上写锁,再加载数据,之后再解写锁,上读锁,在官方文档中有一个这样的例子:




Lock与synchronzied对应,与wait()和notify()对应的则是Condition:
你在将出传统的syncrhonized改成Lock之后,会发现wait和notify没法调了,这话时候需要使用Condition:

Condition condition = lock.newCondition();
condition.await();//this.wait();
condition.signal();//this.notify();
Condition较之以前的lock的好处是,之前的lock.wait()和lock.notify()无法根据实际情况去等待和唤醒一个想要的线程。有了Condition之后,可以设置多个condition,线程等待或唤醒是确定的某一个condition,这样在通信上更明确,也更方便了。

分享到:
评论

相关推荐

    Java 多线程与并发-Java并发知识体系详解.pdf

    线程的中断、互斥同步可以通过中断机制、wait/notify机制和`synchronized`关键字实现,线程间的协作可以使用Condition、CountDownLatch、CyclicBarrier等工具类。 在Java中,除了`synchronized`,还有更高级的锁...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    `ReentrantLock`是Java并发编程中的一种重要工具,它允许线程在已经获取锁的情况下再次获得同一把锁,而不必等待解锁。这在处理递归调用或嵌套锁的场景中特别有用。`ReentrantLock`提供了一种可选的公平策略,即线程...

    java并发编程-AQS和JUC实战

    以上介绍了 Java 并发编程中几个重要的概念和技术,包括 `ReentrantLock`、`Condition`、`Semaphore`、`ReadWriteLock`、`CountDownLatch`、`CyclicBarrier` 和 `LockSupport`。这些技术为我们提供了丰富的并发控制...

    15-linux线程专题讲座-王保明.rar

    - 条件变量(Condition Variable):线程在条件不满足时等待,条件满足时唤醒。 - 信号量(Semaphore):计数型信号量用于限制对资源的并发访问,二进制信号量类似互斥量。 - 线程间通信还可以使用读写锁、屏障、...

    Java并发编程-线程安全与基础构建模块

    在Java编程领域,多线程并发是不可或缺的一部分,特别是在服务器端和高并发应用中。本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    总之,Java并发新特性中的Lock锁和条件变量为开发者提供了更强大的工具来处理多线程同步问题。理解并熟练运用它们,可以编写出更加高效且易于维护的并发代码。在阅读提供的14页PDF文档时,应重点学习Lock的使用场景...

    线程同步方法--Metux 实例

    Metux是一个开源的多线程库,它提供了丰富的线程同步原语,如互斥锁(Mutex)、信号量(Semaphore)和条件变量(Condition Variable)等,这些都是实现线程间协同工作的重要工具。在“TestMutex”这个例子中,我们将...

    JAVA多线程与线程安全实践-基于Http协议的断点续传.rar

    - **线程同步**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量、`CountDownLatch`计数器和`CyclicBarrier`屏障等机制,用于控制并发访问资源的顺序和数量,防止数据竞争。...

    Java 多线程与并发(7-26)-JUC - 类汇总和学习指南.pdf

    Condition 接口用于等待和唤醒线程,Lock 接口用于提供锁定操作,ReadWriteLock 接口用于提供读写锁。 Tools 类则提供了一些有用的工具类,例如 LockSupport 类,用于创建锁和其他同步类的基本线程阻塞原语。 2....

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    多线程并发编程参考资料

    在IT领域,多线程并发编程是不可或缺的一部分,尤其是在现代计算环境中,为了充分利用多核处理器的优势,提升程序的运行效率,开发者必须掌握这一技术。本文将深入探讨标题为"多线程并发编程参考资料"的宝典,重点...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    - **同步机制**:包括`synchronized`关键字、锁(Lock)、条件变量(Condition)等,用于控制多个线程对共享资源的访问,防止数据不一致性。 2. **线程安全**: - **线程不安全**:当多个线程同时访问同一块数据...

    C++-多线程编程总结-实例讲解.doc

    6. **线程同步机制**:`std::condition_variable`是线程间的通信工具,可以用来在满足特定条件时唤醒等待的线程。在任务队列的实现中,`m_cond.signal()`用于唤醒等待的消费者线程,而`m_cond.wait()`则让当前线程...

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    多线程精品资源--记录cpp知识点,面试题,网络编程,多线程编程.zip

    C++提供了多种同步原语,如`std::mutex`(互斥锁)、`std::lock_guard`(互斥锁自动管理器)、`std::condition_variable`(条件变量)等。 3. **线程安全**:如果一个函数或操作在多个线程环境下都能正确工作,那么...

    java socket 多线程并发控制 hibernate mysql

    本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...

    c#线程 lock用法

    `lock`语句是C#中用于实现线程同步的重要工具,主要是为了解决多个线程并发访问共享资源时可能出现的竞争条件(race condition)问题。在描述的场景中,`lock`关键字被用来确保在同一时间只有一个线程可以访问特定的...

Global site tag (gtag.js) - Google Analytics