Java多线程信号量如何控制相关资源

Java多线程信号量如何才能更好的控制相关的数据量?这个问题需要我们就详细的介绍下有关Java多线程信号量的问题,希望大家有所收获,只有不断的学习才能更好的掌握。

创新互联 - 成都机柜租用,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,成都机柜租用,西南服务器托管,四川/成都大带宽,成都机柜租用,四川老牌IDC服务商

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

一种控制访问一组资源的方法(除了简单地上锁之外),就是使用众所周知的信号量计数 (counting semaphore)。Java多线程信号量计数将一组可获得资源的管理封装起来。信号量是在简单上锁的基础上实现的,相当于能令线程安全执行,并初始化为可用资源个数的计数器。例如我们可以将一个信号量初始化为可获得的数据库连接个数。一旦某个线程获得了Java多线程信号量,可获得的数据库连接数减一。

线程消耗完资源并释放该资源时,计数器就会加一。当信号量控制的所有资源都已被占用时,若有线程试图访问此信号量,则会进入阻塞状态,直到有可用资源被释放。Java多线程信号量最常见的用法是解决“消费者-生产者问题”。当一个线程进行工作时,若另外一个线程访问同一共享变量,就可能产生此问题。消费者线程只能在生产者线程完成生产后才能够访问数据。使用信号量来解决这个问题,就需要创建一个初始化为零的信号量,从而让消费者线程访问此信号量时发生阻塞。每当完成单位工作时,生产者线程就会向该信号量发信号(释放资源)。

每当消费者线程消费了单位生产结果并需要新的数据单元时,它就会试图再次获取信号量。因此信号量的值就总是等于生产完毕可供消费的数据单元数。这种方法比采用消费者线程不停检查是否有可用数据单元的方法要高效得多。因为消费者线程醒来后,倘若没有找到可用的数据单元,就会再度进入睡眠状态,这样的操作系统开销是非常昂贵的。尽管Java多线程信号量并未直接被Java语言所支持,却很容易在给对象上锁的基础上实现。一个简单的实现方法如下所示:

 
 
 
  1. class Semaphore {  
  2. private int count;  
  3. public Semaphore(int n) {  
  4. this.count = n;  
  5. }  
  6. public synchronized void acquire() {  
  7. while(count == 0) {  
  8. try {  
  9. wait();  
  10. } catch (InterruptedException e) {  
  11. //keep trying  
  12. }  
  13. }  
  14. count--;  
  15. }  
  16. public synchronized void release() {  
  17. count++;  
  18. notify(); //alert a thread that's blocking on this semaphore  
  19. }  

 

以上就是对Java多线程信号量的详细介绍。

当前文章:Java多线程信号量如何控制相关资源
新闻来源:http://www.36103.cn/qtweb/news1/32701.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联