美文网首页
JDK并发包常用类

JDK并发包常用类

作者: 霸体 | 来源:发表于2019-05-24 11:13 被阅读0次

java本身支持synchronize关键字来进行线程同步,并且在Object根对象中添加了wait() /notify()/notifyAll() 等方法,来实现有条件唤醒。

synchronize底层实际维护了两个队列,一个是竞争锁的队列,一个是等待唤醒的队列;synchronize关键字会使当前线程进入竞争锁队列,wait()会使当前线程进入等待唤醒队列,
Notify()会唤醒最先进入队列的线程,notifyAll() 会按照LIFO依次唤醒等待线程;

JDK提供了强大的并法包工具类,提供了丰富的API来满足各种并发场景,Condition可以更加的灵活创建多个等待唤醒队列。

需要重点掌握的类如下

  • Lock
  • LockSupport
  • Condition
  • ReentrantLock
  • ReadWriteLock
  • ReentrantReadWriteLock
  • BlockingQueue
  • LinkedBlockingQueue
  • ArrayBlockingQueue
  • SynchronousQueue
  • CocurrentHashMap
  • CopyOnWriteArrayList
  • CountDownLatch
  • CyclicBarrier
  • Future
  • FutureTask
  • ForkJoinPool

Lock

类定义

public interface Lock{
  // 进入竞争锁的队列,如果无法获取锁则当前线程进入  
  void lock();
  // 进入竞争锁的队列,可以被其他线程中断 thread.interrupt()
  void lockInterruptibly() throws InterruptedException;
  //尝试获取锁,立即返回
  boolean tryLock();
  // 尝试在指定的时间内获取锁,超时后返回false
  boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
  //释放所会检查是否当前线程有权限释放,否则抛出异常
  void unlock();
  // 只有获取锁的线程,才有资格获取condition然后进入condition条件队列
  Condition newCondition();
}

Condition

image.png

condition 是由生产消费者模型启发而来,之前synchronize里的wait、notify不支持多个等待队列,无法对这种模型做优化。

wait() 提供了带时间的方法,由于平台限制,会有surpurise wake up,带时间的方法返回都提供了是否还有剩余等待时间的线索。

LockSupport

image.png
  • LockSupport 是生产高级锁的底层工具
  • LockSupport 类似于Semaphore,但是只有一个令牌,令牌可以被持有。
  • 推荐使用带Object(blocker)的方法,可以用于监控线程为何被park

相关文章

网友评论

      本文标题:JDK并发包常用类

      本文链接:https://www.haomeiwen.com/subject/etptwxtx.html