`

线程并发工具--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,这样在通信上更明确,也更方便了。

分享到:
评论

相关推荐

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

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

    JAVA高质量并发详解,多线程并发深入讲解

    接着,深入讲解了Java并发编程的核心API,如synchronized关键字、Lock接口、Condition接口、Semaphore等,帮助读者掌握Java并发编程的基本工具和方法。 除了基础知识和API的讲解,本书还重点介绍了Java并发编程的...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于Semaphore构造一个Lock_.mp4  高并发编程第三阶段24讲 Semaphore工具API详细介绍-上_.mp4  高并发编程第三阶段25讲 Semaphore工具API详细介绍-下_.mp4  ...

    java 并发编程 多线程

    java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.

    C++11 并发指南五(stdcondition_variable 详解).docx

    C++11 并发指南五(std::condition_variable 详解) std::condition_variable 是 C++11 标准中 <condition_variable> 头文件里的一个类,用于实现条件变量的功能。条件变量是一种同步机制,允许线程在某个条件下等待...

    JUC多线程学习个人笔记

    锁机制:JUC提供了Lock接口和Condition接口,可以实现更细粒度的锁控制和线程的等待和唤醒机制。 并发工具类:JUC提供了一些并发编程的工具类,如Semaphore、CountDownLatch、CyclicBarrier等,可以实现线程间的协作...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于Semaphore构造一个Lock_.mp4  高并发编程第三阶段24讲 Semaphore工具API详细介绍-上_.mp4  高并发编程第三阶段25讲 Semaphore工具API详细介绍-下_.mp4  ...

    Java并发编程原理与实战

    并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask...

    深入学习python中的并发(一)---线程

    python也提供了线程相关的并发原语,如锁threading.Lock,事件threading.Event,条件变量threading.Condition,信号量 threading.Semaphore. 其实这些Python对象本质上都是对pthread_mutex_t, pthread_condition_t的...

    Java并发程序设计教程

    4、线程间的协调手段:lock、condition、wait、notify、notifyAll☆☆☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList☆☆☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...

    阿里Java并发程序设计教程

    4、线程间的协调手段:lock、condition、wait、notify、notifyAll ☆ ☆ ☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList ☆ ☆ ☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...

    Java编程并发程序设计

    4、线程间的协调手段:lock、condition、wait、notify、notifyAll☆☆☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList☆☆☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...

    龙果java并发编程完整视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    java并发编程

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    多线程编程的核心思想.doc

    多线程编程的核心思想 多线程编程的核心思想是指在多线程环境下如何实现线程安全、...多线程编程的核心思想是通过 Lock 和 Condition 接口来实现线程安全和同步机制,并使用 AQS 底层实现来实现锁和 Condition 接口。

    Lock锁的底层原理完整版

    Lock锁,一种线程同步机制,其主要功能是防止多个线程同时访问同一代码块,从而避免因并发问题引发的数据不一致或其他错误。Lock锁的灵活性相比synchronized更高,它支持手动获取和释放锁,能够中断的获取锁以及超时...

    Java 并发编程原理与实战视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    Java 7并发编程实战手册

    全书分为9章,涵盖了线程管理、线程同步、线程执行器、Fork/Join框架、并发集合、定制并发类、测试并发应用等内容。全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完...

    Java并发编程实战

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

Global site tag (gtag.js) - Google Analytics