Java并发工具包中的同步框架解析

需积分: 9 2 下载量 155 浏览量 更新于2024-07-16 收藏 496KB PDF 举报
"这篇文档是Doug Lea撰写的一篇关于java.util.concurrent同步框架的文章,发表在2005年的《Science of Computer Programming》杂志上。文章深入探讨了J2SE 5.0版本中java.util.concurrent包中的同步器(如锁、屏障等)的构建基础——AbstractQueuedSynchronizer(AQS)框架。该框架提供了原子性管理同步状态、阻塞和唤醒线程以及队列操作的通用机制。" 正文: Java.util.concurrent同步框架是Java并发编程的重要组成部分,由Doug Lea设计并引入到J2SE 5.0版本中。这个框架的核心是AbstractQueuedSynchronizer(AQS),它是一个抽象基类,用于实现各种同步组件,如锁、信号量、屏障等。AQS通过内部维护一个同步状态,并提供了一套API来原子地操作这个状态。 1. AQS的原理与设计 AQS使用了一个FIFO(先进先出)的等待队列来管理那些因获取同步状态失败而被阻塞的线程。线程通过调用`acquire`方法尝试获取状态,如果失败则被添加到队列尾部。当同步状态释放时,队首的线程会被唤醒并重新尝试获取。 2. 原子操作 AQS的关键在于其提供了原子性的状态更新操作,这通常通过CAS(Compare and Swap)指令实现。这种无锁的并发策略确保了在多线程环境下对同步状态的修改是线程安全的。 3. 状态转移 AQS的状态可以由使用者自定义,通过继承AQS并重写特定的方法,如`tryAcquire`和`tryRelease`,来控制同步状态的获取和释放逻辑。这些方法的实现决定了同步组件的行为。 4. 阻塞与唤醒 当线程尝试获取同步状态失败时,AQS会将线程加入等待队列并进入阻塞状态。当同步状态改变,如被其他线程释放时,AQS会自动唤醒队首的线程,使其重新尝试获取。 5. 使用示例 Java中的`ReentrantLock`、`CountDownLatch`、`Semaphore`等类都是基于AQS实现的。它们各自通过定制AQS的状态和获取/释放规则,实现了不同的同步行为。 6. 性能考量 文章讨论了AQS框架在性能上的优势,包括其低开销的阻塞和唤醒机制,以及高效的状态管理。通过AQS,开发者可以方便地创建高性能且线程安全的同步组件。 7. 结论 Doug Lea的这篇文章不仅介绍了AQS的设计和实现,还提供了一些使用示例和性能分析,对于理解和使用Java并发库具有很高的参考价值。通过理解AQS,开发者能够更好地利用Java.util.concurrent包,创建高效且可扩展的并发程序。 java.util.concurrent同步框架是Java并发编程的重要工具,它简化了复杂的线程同步问题,使得开发者可以专注于业务逻辑而不是底层的同步细节。AbstractQueuedSynchronizer作为框架的核心,它的设计理念和实现方式对于提升并发程序的性能和可维护性至关重要。

2023-07-12 13:37:05.290 -ERROR 17024 [pool-7-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task. java.lang.NullPointerException: null at com.ipi.negotiate.task.NegotiateSmallNegotiateTask.qslSmallNegotiateEnd(NegotiateSmallNegotiateTask.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) at java.util.concurrent.FutureTask.run(FutureTask.java) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

2023-07-13 上传