- 浏览: 307066 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wst0350:
点赞,有空深入讲解下原理
Servlet、Filter 和 Listener 调用顺序、生命周期的实验分析 -
tuspark:
Eclipse中高亮设置内容还有很多细节选项可以设置的,可以看 ...
Eclipse 设置匹配代码高亮 -
xichao1929:
这个时候,怎么启动发布的项目呢?????
JBoss设置为Windows服务 -
xiaozi7:
非常感谢,楼主的英语水平不一般那
WebSphere MQ Version 7 发布订阅相关配置 -
qtlkw:
slave没玩过
Hudson: java.lang.OutOfMemoryError: Java heap space error
如果一个线程要访问一个共享资源,它必须先获得信号量。如果信号量的内部计数器大于0,信号量减1,然后允许访问这个共享资源。计数器大于0意味着有可以使用的资源,线程允许使用其中一个资源。
否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0,计数器等于0的时候意味着所有的共享资源已经被其他线程使用了,所以需要访问这个共享资源的线程必须等待。
当线程使用完某个共享资源时,信号量必须被释放,以便其他线程能够访问共享资源。释放操作将使信号量的内部计数器增加1。
资源: 打印队列
Runnable job:
Main:
用信号量来保护一个资源的多个副本。
否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0,计数器等于0的时候意味着所有的共享资源已经被其他线程使用了,所以需要访问这个共享资源的线程必须等待。
当线程使用完某个共享资源时,信号量必须被释放,以便其他线程能够访问共享资源。释放操作将使信号量的内部计数器增加1。
资源: 打印队列
import java.util.concurrent.Semaphore; /** * Created by Administrator. */ public class PrintQueue { private final Semaphore semaphore; public PrintQueue(){ semaphore = new Semaphore(1); } public void printJob(Object document){ try{ semaphore.acquire(); long duration = (long)(Math.random() * 10); System.out.printf("%s: PrintQueue: Printing a Job during %d seconds\n", Thread.currentThread() .getName(), duration ); Thread.sleep(duration); }catch(InterruptedException e){ e.printStackTrace(); }finally{ semaphore.release(); System.out.printf("%s: Done the print job\n", Thread.currentThread().getName()); } } }
Runnable job:
public class Job implements Runnable { private PrintQueue printQueue; public Job(PrintQueue printQueue){ this.printQueue=printQueue; } @Override public void run(){ System.out.printf("%s: Going to print a job\n", Thread.currentThread().getName()); printQueue.printJob(new Object()); System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName()); } }
Main:
public class Main { public static void main(String args[]){ PrintQueue printQueue = new PrintQueue(); Thread thread[] = new Thread[10]; for(int i=0; i<10; i++){ thread[i] = new Thread(new Job(printQueue), "Thread " + i); } for(int i=0; i<10; i++){ thread[i].start(); } } }
用信号量来保护一个资源的多个副本。
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by Administrator. */ public class PrintQueue { private final Semaphore semaphore; private boolean freePrinters[]; private Lock lockPrinters; public PrintQueue(){ semaphore = new Semaphore(3); freePrinters=new boolean[3]; for(int i=0; i<3; i++){ freePrinters[i] = true; } lockPrinters=new ReentrantLock(); } public void printJob(Object document){ try{ semaphore.acquire(); int assignedPrinter = getPrinter(); long duration = (long)(Math.random() * 10); System.out.printf("%s: PrintQueue: Printing a Job in Printer %d during %d seconds\n", Thread.currentThread() .getName(), assignedPrinter, duration ); TimeUnit.SECONDS.sleep(duration); freePrinters[assignedPrinter]=true; }catch(InterruptedException e){ e.printStackTrace(); }finally{ semaphore.release(); System.out.printf("%s: Done the print job\n", Thread.currentThread().getName()); } } private int getPrinter(){ int ret = -1; try{ lockPrinters.lock(); for(int i=0; i<freePrinters.length; i++){ if(freePrinters[i]){ ret = i; freePrinters[i] = false; break; } } }catch(Exception e){ e.printStackTrace(); }finally{ lockPrinters.unlock(); } return ret; } }
发表评论
-
es使用两种方式
2018-06-28 16:26 0第一种方式: 使用TransportClient packag ... -
hbase
2018-06-25 13:50 0package cn.com.duiba.appordersy ... -
guava
2017-09-22 18:03 6381.Guava Cache的get/getIfPresent方 ... -
转:架构
2017-06-23 08:13 493架构是软件的核心和灵魂,没有好的架构的软件经过一段时间的迭代后 ... -
使用 redis 减少 秒杀库存 超卖思路
2017-06-22 23:58 561612月份重构公司社群活动产品,原来自己不是很成熟,按传统的形式 ... -
经典笔试题
2017-06-21 23:30 495public class BaseTest { pu ... -
Restful vs RPC
2017-01-23 10:54 865传统的RPC一般是基于二 ... -
自动产生随机数
2016-11-11 10:54 555/** * java生成随机数字和字母组合 ... -
commons-lang常用工具类StringEscapeUtils
2016-11-10 20:12 8831.escapeSql 提供sql转移功能,防止sql注入攻击 ... -
Java8:Lambda表达式增强版Comparator和排序
2016-10-27 10:32 2693http://www.importnew.com/15259. ... -
Java序列化几点注意事项
2016-10-26 17:02 894静态变量不属于对象,属于类,不能被序列化.还有瞬态的变量也不能 ... -
Rest vs dubbo
2016-09-15 18:10 0Rest 基于http, 大数据量和安全性可能不佳 dubbo ... -
List删除element两种方式的不同
2016-07-26 12:41 679public class DateUtilTest { ... -
Xmemcached——比spymemcached更快
2016-07-18 10:23 466Xmemcached是一个高性能的 ... -
velocity 缓存设置
2016-07-04 20:54 1062#velocity 是否开启缓存 velocity.resou ... -
Java8 Stream用法
2016-07-04 18:58 01. collect(toList()) 由stream里的值 ... -
熔断器设计模式
2016-05-22 23:14 598转载: http://www.cnblogs.com/ ... -
Date 参数
2016-04-22 21:44 561Oracle TO_CHAR parameters: The ... -
Dubbo安装部署
2016-04-18 01:16 1607Jdk-1.6.30以上版本 Tomcat-7 ... -
java read也需要加锁
2016-02-27 18:11 642今天被问到read需不需要加锁,结果没答上来。自己写了一个程序 ...
相关推荐
在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二进制信号量和计数信号量。 1. **信号量的原理**: - 信号量是一个整数值,表示可用资源的数量。当线程需要使用资源时,...
Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...
在Java中,`java.util.concurrent.Semaphore`类为我们提供了信号量的功能,它允许我们限制同时访问某个资源的线程数量,从而实现线程同步和资源管理。 信号量主要包含两种类型:可重用信号量(非递减信号量)和二...
Semaphore当前在多线程环境下被扩放用法,操作系统的信号量是个很重要的概念,在进程掌握方面都有应用。Java并发库Semaphore可以很轻松完成信号量掌握,Semaphore可以掌握某个资源可被同时访问的个数,通过acquire()...
Java 信号量Semaphore的实现 Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的...
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
在哲学家就餐问题中,如果不使用信号量,我们也可以考虑使用synchronized来控制哲学家对筷子的访问,但这种方式可能不如信号量那样灵活。 总的来说,这个Java程序展示了如何使用多线程和同步技术解决并发问题,这...
Semaphore,中文通常称为信号量,是Java并发编程中的一种重要工具,自JDK 1.5版本起被引入。它主要用于控制对特定资源的并发访问,确保资源得到合理的使用。Semaphore维护了一组虚拟的许可,其数量在创建时由用户...
虽然Java标准库没有直接提供同步互斥结构,但它提供了基于对象锁的`wait()`和`notify()`方法,这使得我们可以实现Dijkstra的计数信号量概念。 信号量是一种在多线程编程中用于控制资源访问的机制。在Java中,可以...
Semaphore类提供了信号量的概念,允许我们设定一个固定的许可(或者称为权限)数量,只有拥有足够许可的线程才能继续执行。 在描述中提到的场景,比如限制WebServer同时处理的请求数量为500个,Semaphore就非常适用...
在Java中,我们可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建一个信号量时,可以指定初始许可证的数量。以下是一个简单的示例: ```java import java.util.concurrent.Semaphore; public class ...
在Java中,`java.util.concurrent.Semaphore`类提供了信号量功能。信号量有两个重要的参数: - 允许的许可证数量:表示可以并发访问的资源数量。 - 是否公平:若为true,按照请求顺序分配许可证;若为false(默认)...
Semaphore(信号量)是一种经典的同步机制,它源自于荷兰计算机科学家Edsger W. Dijkstra提出的银行家算法。本示例中,我们将深入探讨如何使用Semaphore来控制多线程的循序执行。 Semaphore是一种计数信号量,它...
在Java中,我们可以使用信号量(Semaphore)来解决不死锁的哲学家问题。信号量是一种同步原语,用于控制对共享资源的访问。在本实现中,我们将创建两个类型的信号量:一个用于表示筷子,另一个用于控制哲学家可以...
6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...
标题“semaphore:显示简单信号量的Android应用程序”揭示了这是一个基于Android平台的应用程序,它使用了计算机科学中的“信号量”概念。在操作系统中,信号量是一种同步机制,用于控制对共享资源的访问,以防止多个...
Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。通过合理使用 Semaphore,可以有效地管理多线程对共享资源的访问...
Semaphore,中文可译为信号量,起源于操作系统中的同步原语,用于协调多个线程对共享资源的访问。它维护了一个计数器,该计数器表示可用许可证的数量。当线程请求许可证时,如果计数器不为零,则会减少一个并允许...
信号量(Semaphore)是Java并发库中的一种工具类,它提供了一种控制多个线程对共享资源访问的方式,从而实现高级别的同步。在Java 5引入并发包`java.util.concurrent`后,信号量作为`Semaphore`类被添加,成为并发...
Semaphore是Java并发编程中的一种重要工具,它是一个计数信号量,可以用来限制对共享资源的访问权限。在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的...