JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Semaphore信号量类详解 信号量的值是什么

wys521 2024-11-06 20:35:00 精选教程 23 ℃ 0 评论

Semaphore类是一个计数信号量,必须由获取它的线程释放,通常用于限制可以访问某些资源(物理或逻辑的)线程数目,信号量控制的是线程并发的数量。

计数器:一个信号量有且仅有3种操作,且它们全部是原子的:初始化、增加和减少

增加可以为一个进程解除阻塞;

减少可以让一个进程进入阻塞。

原理理解:

Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。

如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。

构造方法:

Semaphore有两个构造方法 Semaphore(int)、Semaphore(int,boolean)

参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的

方法区:

初始化:

Semaphore(int permits)参数permits就是允许同时运行的线程数目;

获取信号:

semaphore.acquire();获取一次执行的机会,可以指定每次动态获取的次数 例如:每次获取3个semaphore.acquire(3);

释放信号:

release()、release(int)

查看现在可用的信号量,返回int

semaphore.availablePermits()

获得唤醒呼叫,从信号量中获取两个许可,并且在获得许可之前,一直将线程阻塞。

semaphore.acquireUninterruptibly(2);

返回当前许可数,全部排掉清0

semaphore.drainPermits()

思考:

在很多情况下,可能有多个线程需要访问数目很少的资源。假想在服务器上运行着若干个回答客户端请求的线程。这些线程需要连接到同一数据库,但任一时刻只能获得一定数目的数据库连接。你要怎样才能够有效地将这些固定数目的数据库连接分配给大量的线程?

答:1.给方法加同步锁,保证同一时刻只能有一个人去调用此方法,其他所有线程排队等待,但是此种情况下即使你的数据库链接有10个,也始终只有一个处于使用状态。这样将会大大的浪费系统资源,而且系统的运行效率非常的低下。

2.另外一种方法当然是使用信号量,通过信号量许可与数据库可用连接数相同的数目,将大大的提高效率和性能。

例:停车位

package com.lt.thread.SamephoreTest;

import java.util.concurrent.Semaphore;

public class Parking implements Runnable {

private int count;

private Semaphore semaphore;

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

public Semaphore getSemaphore() {

return semaphore;

}

public void setSemaphore(Semaphore semaphore) {

this.semaphore = semaphore;

}

public Parking(int count)

{

this.count=count;

this.semaphore=new Semaphore(count);

}

public void parking()

{

try {

semaphore.acquire();

try {

Thread.sleep(100);

System.out.println(Thread.currentThread().getName()+" find a paking space");

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

catch (InterruptedException e)

{

e.printStackTrace();

}

finally {

System.out.println(Thread.currentThread().getName()+" release a paking space");

semaphore.release();

}

}

@Override

public void run()

{

this.parking();

}

public static void main(String[] args)

{

Parking parking=new Parking(5);

Thread[] threads=new Thread[13];

for (int i=0;i<threads.length;i++)

{

threads[i]=new Thread(parking,"thread"+i);

}

for (int i=0;i<threads.length;i++)

{

threads[i].start();

}

}

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表