资讯动态

Semaphore实现线程同步

发布时间:2026/8/15 22:09:02 来源:尧图企业网站定制
以下是您提供的 14 个 Java 并发程序示例的简要执行说明和核心要点。1. Semaphore信号量示例 (Listing 1)功能演示使用Semaphore控制对共享资源Shared.count的访问确保同一时间只有一个线程IncThread或DecThread能修改它。执行运行SemDemo类的main方法。两个线程将交替获取许可、修改count并释放许可输出结果将显示count从 0 递增到 5再递减回 0 的序列不会出现交错 。2. 生产者-消费者模型 (Listing 2)功能使用两个Semaphore(semProd和semCon) 实现经典的生产者-消费者同步确保生产者在消费者取走数据前不会覆盖数据消费者在没有新数据时等待 。执行运行ProdCon类的main方法。输出将交替显示Put和Got消息顺序为Put: 0,Got: 0,Put: 1,Got: 1... 直至 19。3. CountDownLatch 示例 (Listing 3)功能演示CountDownLatch用于让一个或多个线程等待其他线程完成操作。主线程调用await()等待工作线程 (MyThread) 每完成一次任务调用countDown()当计数器减至 0 时主线程继续执行 。执行运行CDLDemo类的main方法。输出顺序为Starting然后打印 0 到 4最后打印Done。4. CyclicBarrier 示例 (Listing 4)功能演示CyclicBarrier让一组线程相互等待到达屏障点后一起继续执行并可选择执行一个屏障动作 (BarAction) 。执行运行BarDemo类的main方法。三个线程 (A,B,C) 打印各自名称后在await()处等待当所有三个线程都到达后执行BarAction打印Barrier Reached!然后所有线程继续。5. Exchanger 示例 (Listing 5)功能演示Exchanger用于两个线程间交换数据。MakeString线程构建字符串UseString线程消费字符串两者通过exchange()方法同步交换数据 。执行运行ExgrDemo类的main方法。MakeString生成字符串如ABCDE与UseString交换UseString打印Got: ABCDE此过程重复三次。6. Phaser 基础示例 (Listing 6)功能演示Phaser作为更灵活的同步屏障支持动态注册/注销参与线程及分阶段 (Phase) 同步。主线程和工作线程 (A,B,C) 协同推进多个阶段 。执行运行PhaserDemo类的main方法。输出将显示每个线程依次开始三个阶段主线程在每个阶段完成后打印Phase X Complete最后打印The Phaser is terminated。7. 自定义 Phaser 示例 (Listing 7)功能通过继承Phaser并重写onAdvance()方法控制固定阶段数本例为 4 个阶段的执行。当所有阶段完成或注册方为 0 时Phaser 终止 。执行运行PhaserDemo2类的main方法。每个工作线程会循环执行阶段直到 Phaser 终止输出显示每个阶段的开始和完成信息。8. Executor 框架示例 (Listing 8)功能演示使用ExecutorService(newFixedThreadPool(2)) 管理线程池执行任务。结合CountDownLatch等待所有任务完成 。执行运行SimpExec类的main方法。四个任务 (A,B,C,D) 被提交到只有两个线程的池中执行每个任务打印 0 到 4。主线程等待所有任务完成后打印Done。9. Callable 与 Future 示例 (Listing 9)功能演示使用Callable接口替代Runnable提交可返回结果的任务并通过Future对象获取结果。展示了线程池执行计算任务并汇总结果 。执行运行CallableDemo类的main方法。三个Callable任务计算和、斜边、阶乘被提交执行主线程通过Future.get()获取并打印结果55, 5.0, 120。10. ReentrantLock 示例 (Listing 10)功能演示使用ReentrantLock实现显式锁来同步对共享资源 (Shared.count) 的访问提供了比synchronized更灵活的锁操作如可中断、超时、公平性等。执行运行LockDemo类的main方法。两个线程 (A,B) 将竞争锁获得锁的线程增加Shared.count并睡眠 1 秒然后释放锁。输出显示锁的获取和释放过程。11. Atomic原子变量示例 (Listing 11)功能演示使用AtomicInteger实现无锁的线程安全计数器。getAndSet()操作是原子的无需外部同步 。执行运行AtomicDemo类的main方法。三个线程 (A,B,C) 并发调用Shared.ai.getAndSet(i)由于是原子操作不会出现数据竞争但输出顺序不确定。12. Fork/Join 框架 (RecursiveAction) 示例 (Listing 12)功能演示使用ForkJoinPool和RecursiveAction并行处理数组计算平方根。任务在数据量超过阈值 (seqThreshold) 时递归分解利用工作窃取算法提高性能 。执行运行ForkJoinDemo类的main方法。程序将 0 到 99999 的数组元素并行转换为平方根并打印前 10 个元素的原始值和转换后的值。13. Fork/Join 参数化实验示例 (Listing 13)功能扩展 Listing 12允许通过命令行参数设置并行级别 (parallelism) 和顺序处理阈值 (threshold)用于实验和性能调优 。执行需带两个命令行参数运行例如java FJExperiment 2 1000。程序将根据参数并行处理数组偶数索引平方根奇数索引立方根并输出执行时间。14. Fork/Join框架 (RecursiveTask) 示例 (Listing 14)功能演示使用RecursiveTaskDouble执行有返回值的并行计算数组求和。任务递归分解子任务结果通过fork()/join()合并 。执行运行RecurTaskDemo类的main方法。程序并行计算一个包含正负交替值的数组的总和并打印结果Summation 0.0因为正负抵消。参考来源Java 多线程同步机制探秘Java多线程与同步机制深入理解Java多线程同步机制Java 多线程同步机制Java多线程的同步机制

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价