使用信号量来控制线程数

时间:2011-03-11 08:07:10

标签: java multithreading semaphore

如何使用Semaphore类来控制有权访问对象的线程数?

5 个答案:

答案 0 :(得分:4)

  • 使用最大数量的threds初始化信号量,
  • 如果线程进入受限区域,则将信号量计数器减1;
  • 如果thred离开受限区域,
  • 将信号量计数器增加1

答案 1 :(得分:2)

使用信号量控制资源访问权限的另一个好处是可以在运行时调整信号量。例如,您可以拥有一些用例,您希望允许更多用户根据某些业务逻辑访问资源,然后再次减少它。 可调整大小的信号量的示例代码

public class ResizeableSemaphore extends Semaphore
{

    private static final long serialVersionUID = 1L;
    private int permit;
    public ResizeableSemaphore(int permit) {
        super(permit);
        this.permit=permit;
    }       

    public synchronized void resizeIfRequired(int newPermit)
    {
        int delta = newPermit - permit;
        if(delta==0) return;
        if(delta > permit) this.release(delta); // this will increase capacity
        if(delta < 0) this.reducePermits(Math.abs(delta));
        this.permit=newPermit;
    }   
}

答案 2 :(得分:0)

这是一个很好的例子,说明如何使用信号量来限制对象的并发访问:

http://technicalmumbojumbo.wordpress.com/2010/02/21/java-util-concurrent-java-5-semaphore/

关键点是:

  • 构造信号量时,可以声明最大并发数(即允许并发访问的线程数)
  • 您需要每个线程尝试获取()信号量;让信号量跟踪并发访问

答案 3 :(得分:0)

只需使用:

java.util.concurrent.Semaphore

有一个关于如何在javadoc中使用它的广泛示例:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html

答案 4 :(得分:0)

也许您可以阅读this question的答案,并查看this example