Guava库学习:学习Concurrency(一)Synchronizing threads

    链接地址:http://www.xx566.com/detail/152.html

    上一篇,Guava库学习:Guava Collections 知识汇总 中,我们把整个Guava Collections系列的文章做了汇总,对Guava Collection系列的学习,我们学习到了Guava通用工具库处理集合的优势和简便,本篇起,我们开始学习Guava库的另一亮点并发性,Guava Concurrency。

 

   我们知道 Java5之后引入的java.util.concurrent工具包,使得在Java开发中使用并发变得简便,Guava Concurrency是在此基础上进行的扩展,除了那些java.util.concurrent中提供的并发包,com.google.util.concurrent中提供了更多的非常有用的特性,来帮助我们更简便的实现并发编程。

 

    这个系列中,我们将包含以下内容:

  • Monitor类作为一个互斥锁,确保串行访问我们代码中定义的区域,就像synchronized关键字一样,但是在语义上更容易理解,并包含一些有用的附加功能。

  • ListenableFuture类,和Java中的一些监听类作用相似,在并发编程中, 我们可以通过注册一个回调函数,在Future完成后执行。

  • FutureCallback类,能够帮助我们接收Future任务返回的结果,允许我们处理失败或成功的场景。

  • SettableFuture、AsyncFunction和FutureFallback类,有用的实用程序类,我们可以在处理Future实例和Future做异步转换对象的时候使用

  • Futures类提供了许多有用的静态方法用于处理Future实例。

  • RateLimiter类用于限制线程访问资源的频率,它很像信号量的限制,但实质是限制线程的数量,RateLimiter类限制基于时间的访问。

 

    线程的同步

    自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码。Java提供了同步关键 字synchronized来实现这种访问控制,但是使用synchronized会存在一些问题。第一个问题是,当我们需要调用线程的wait()方法 时,我们必须记得去使用while循环:

while(某种条件){
try {
wait();
} catch (InterruptedException e) {
//出现异常我们并不关心,但我们可能需要唤醒线程,
Thread.interrupt() 
}
}

    第二个问题是,但存在不止一种条件会导致我们的线程进入等待状态时,我们必须调用notifyAll()唤醒线程,因为并没有方法来唤醒特定条件下的线程,使用notifyAll()而不 是notify()并不可取,因为所有唤醒的线程都会去竞争唯一的锁,但是只有一个能够得到锁

    Java 5提供的ReentrantLock类可以创建条件,我们可以使用ReentrantLock.newCondition()方法实现更细的粒度,现在我 们可以通过调用Condition.signal()方法(类似于notify()方法)来唤醒一个在特定条件发生后处于等待状态的线程,当然也有一个 Condition.signalAll()方法唤醒所有的线程,类似于notifyAll()。但是仍然会存在违背本意的while循环处理:

while(list.isEmpty()){
    Condition.await();
}

    幸运的是,Guava提供了这些问题的解决方案,Monitor类,下一篇,我们会详细进行Monitor类的学习和使用,欢迎继续关注。

你可能感兴趣的:(guava,concurrency,Threads,Synchronizing)