温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java多线程:Semaphore如何控制并发

发布时间:2025-07-21 03:49:21 来源:亿速云 阅读:107 作者:小樊 栏目:编程语言

在Java中,Semaphore是一个计数信号量,用于控制同时访问特定资源的线程数量。它维护了一组许可证,线程在访问资源之前必须获取许可证,访问结束后释放许可证。如果许可证已全部被占用,请求的线程将被阻塞,直到有许可证可用。

以下是如何使用Semaphore来控制并发的步骤:

  1. 创建Semaphore对象: 首先,你需要创建一个Semaphore对象,并指定允许的许可证数量。

    import java.util.concurrent.Semaphore;
    
    public class Resource {
        private final Semaphore semaphore;
    
        public Resource(int permits) {
            this.semaphore = new Semaphore(permits);
        }
    }
    
  2. 获取许可证: 在访问共享资源之前,线程需要调用acquire()方法来获取许可证。如果许可证不可用,线程将被阻塞,直到有许可证可用。

    public void useResource() throws InterruptedException {
        semaphore.acquire();
        try {
            // 访问共享资源
        } finally {
            semaphore.release();
        }
    }
    
  3. 释放许可证: 在访问完共享资源后,线程需要调用release()方法来释放许可证,以便其他线程可以获取并访问资源。

    public void releaseResource() {
        semaphore.release();
    }
    
  4. 示例代码: 下面是一个完整的示例,展示了如何使用Semaphore来控制对共享资源的并发访问。

    import java.util.concurrent.Semaphore;
    
    public class Resource {
        private final Semaphore semaphore;
    
        public Resource(int permits) {
            this.semaphore = new Semaphore(permits);
        }
    
        public void useResource() throws InterruptedException {
            semaphore.acquire();
            try {
                System.out.println(Thread.currentThread().getName() + " is using the resource.");
                Thread.sleep(1000); // 模拟资源使用时间
            } finally {
                semaphore.release();
                System.out.println(Thread.currentThread().getName() + " has released the resource.");
            }
        }
    
        public static void main(String[] args) {
            Resource resource = new Resource(3); // 允许最多3个线程同时访问
    
            for (int i = 0; i < 10; i++) {
                new Thread(() -> {
                    try {
                        resource.useResource();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        }
    }
    

在这个示例中,Resource类有一个Semaphore对象,初始许可证数量为3。useResource()方法在访问资源之前获取许可证,访问结束后释放许可证。main方法创建了10个线程,每个线程都尝试访问资源。由于许可证数量限制为3,因此最多只有3个线程可以同时访问资源。

通过这种方式,Semaphore可以有效地控制并发访问,防止资源过载。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI