前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java并发工具 - 使用Semaphore实现线程同步

Java并发工具 - 使用Semaphore实现线程同步

作者头像
用户1289394
发布2024-04-15 13:28:26
2550
发布2024-04-15 13:28:26
举报
文章被收录于专栏:Java学习网

Java中的并发工具之一是Semaphore(信号量),它可以用于实现线程之间的同步和互斥。下面将详细介绍Semaphore的概念、用法和示例,以帮助您理解如何使用Semaphore来实现线程同步。

Semaphore概述

Semaphore是一种计数信号量,它主要用于控制对共享资源的访问。它维护了一个计数器,该计数器表示可用的通路数量。当线程需要访问共享资源时,首先尝试获取一个信号量,如果信号量计数大于零,则允许访问该资源,并将信号量计数减一;否则,线程将被阻塞,直到有一个通路可用。当线程完成对共享资源的访问后,释放信号量,将信号量计数加一,以允许其他线程访问共享资源。

Semaphore常用的方法有两个:

  • acquire():尝试获取一个通路,如果没有可用通路则阻塞线程。
  • release():释放一个通路,增加信号量计数。

Semaphore可以用于以下情况:

  • 控制对有限资源的并发访问:例如,数据库连接池中的连接数限制。
  • 实现线程之间的顺序执行:通过设置Semaphore的初始计数为1,保证只有一个线程可以访问共享资源。

使用Semaphore实现线程同步示例

下面是一个使用Semaphore实现线程同步的示例,假设有5个线程需要同时访问某个共享资源,但最多只能允许2个线程访问:

代码语言:javascript
复制
import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    private static final int THREAD_COUNT = 5;
    private static final int MAX_PERMITS = 2;

    private static Semaphore semaphore = new Semaphore(MAX_PERMITS);

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            Thread thread = new Thread(new Worker(i));
            thread.start();
        }
    }

    static class Worker implements Runnable {
        private int workerId;

        public Worker(int workerId) {
            this.workerId = workerId;
        }

        @Override
        public void run() {
            try {
                System.out.println("Worker " + workerId + " is waiting...");
                semaphore.acquire();
                System.out.println("Worker " + workerId + " is accessing the shared resource.");
                Thread.sleep(2000); // 模拟访问共享资源的耗时操作
                System.out.println("Worker " + workerId + " has finished accessing the shared resource.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        }
    }
}

在上述示例中,我们创建了5个Worker线程,每个线程都会尝试获取一个信号量通路(acquire方法),如果信号量计数为0,则线程将被阻塞。当线程成功获取到通路后,它会打印访问共享资源的消息,并模拟对共享资源的访问操作。访问完成后,线程会释放信号量通路(release方法),以便其他线程可以继续访问共享资源。

通过运行上述示例,您可以观察到只有两个线程同时访问共享资源,其他线程需要等待释放通路后才能访问。

使用Semaphore可以灵活控制线程之间的同步和互斥,使多个线程能够安全地访问共享资源,避免竞态条件和数据不一致的问题。但要注意,信号量的计数应根据实际需求进行适当的设置,以避免死锁或资源浪费的情况发生。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Semaphore概述
  • 使用Semaphore实现线程同步示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档