项目现场同事发现应用不定期卡死,堆栈信息显示大部分线程在等待,是因为maxWait参数未配置。配置maxWait后问题解决。
文章讨论了使用 Alibaba Druid 数据源时应用程序无响应的问题,主要由于线程在等待 `com.alibaba.druid.pool.DruidDataSource.takeLast()` 方法导致死锁。通过配置 `maxWait` 参数可以解决此问题,避免程序无限等待连接。默认情况下,`maxWait` 为 -1,表示无限等待。更新版本中对此进行了修正。
J.U.C下的AQS子包类支持排它锁和共享锁模式,内部维护了一个CLH队列,支持CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask等同步组件,可以控制有限访问的资源,实现多线程之间相互等待,可以重置计数器,支持设置等待超时。ReentrantLock与synchronized有可重入性、锁的实现、性能的区别、功能区别,ReentrantLock独有的功能有指定公平锁、提供Condition类、提供中断等待锁的机制,synchronized的优势有不用手动释放锁、JVM生成线程转储时能够锁定信息、可以在所有JVM版本中工作,ReentrantReadWriteLock可以避免写锁饥饿。
AQS 的全称为(AbstractQueuedSynchronizer),AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器。
condition用于显式的等待通知,等待过程可以挂起并释放锁,唤醒后重新拿到锁。
当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒?
完成下面两步后,将自动完成登录并继续当前操作。