「java信号量」java信号量机制

博主:adminadmin 2022-12-31 05:12:09 761

本篇文章给大家谈谈java信号量,以及java信号量机制对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java的信号量和线程池的区别

线程组:线程组存在的意义,首要原因是安全。java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。 线程池:线程池存在的意义,首要作用是效率。线程的创建和结束都需要耗费一定的系统时间(特别是创建),不停创建和删除线程会浪费大量的时间。所以,在创建出一条线程并使其在执行完任务后不结束,而是使其进入休眠状态,在需要用时再唤醒,那么 就可以节省一定的时间。如果这样的线程比较多,那么就可以使用线程池来进行管理。保证效率。 线程组和线程池共有的特点:1,都是管理一定数量的线程2,都可以对线程进行控制---包括休眠,唤醒,结束,创建,中断(暂停)--但并不一定包含全部这些操作。

java 并发信号量和普通锁的区别

本质上并没有区别,都是锁跟钥匙的关系。

普通锁,就是只有一把钥匙的情况。

而信号量就是提供了可设定钥匙的数量的操作,当它的钥匙数量为1时,跟普通锁没有区别,至少在功能上是这样的。

原理都是有钥匙可以做事,没钥匙等着,做完事再把钥匙还回去。唯一的不同就是,钥匙的数量,从只能是一把,变成可以多把,而多把意味着同一时间可以做事的人变多了,提升性能,随之就是并行导致的一系列多线程问题了,这就不展开了。

JAVA可以发物理信号量吗

package synchronization;

public class Semaphore {

private int value;

public Semaphore(){

this.value = 0;

}

public Semaphore(int v){

this.value = v;

}

public synchronized void down(){

while(value = 0 ){

try{

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

value--;

}

public synchronized void up(){

value++;

notify();

}

}

使用的时候Semophore s;

while(true){

s.wait();

//临界区

s.signal();

}

Semaphore信号量的底层原理

Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失(译者注:下文会具体介绍),或者像锁一样用于保护一个关键区域。自从5.0开始,jdk在java.util.concurrent包里提供了Semaphore 的官方实现,因此大家不需要自己去实现Semaphore。但是还是很有必要去熟悉如何使用Semaphore及其背后的原理

本文的涉及的主题如下:

一、简单的Semaphore实现

下面是一个信号量的简单实现:

查看源代码打印帮助

Take方法发出一个被存放在Semaphore内部的信号,而Release方法则等待一个信号,当其接收到信号后,标记位signal被清空,然后该方法终止。

使用这个semaphore可以避免错失某些信号通知。用take方法来代替notify,release方法来代替wait。如果某线程在调用release等待之前调用take方法,那么调用release方法的线程仍然知道take方法已经被某个线程调用过了,因为该Semaphore内部保存了take方法发出的信号。而wait和notify方法就没有这样的功能。

当用semaphore来产生信号时,take和release这两个方法名看起来有点奇怪。这两个名字来源于后面把semaphore当做锁的例子,后面会详细介绍这个例子,在该例子中,take和release这两个名字会变得很合理。

二、可计数的Semaphore

上面提到的Semaphore的简单实现并没有计算通过调用take方法所产生信号的数量。可以把它改造成具有计数功能的Semaphore。下面是一个可计数的Semaphore的简单实现。

三、有上限的Semaphore

上面的CountingSemaphore并没有限制信号的数量。下面的代码将CountingSemaphore改造成一个信号数量有上限的BoundedSemaphore。

在BoundedSemaphore中,当已经产生的信号数量达到了上限,take方法将阻塞新的信号产生请求,直到某个线程调用release方法后,被阻塞于take方法的线程才能传递自己的信号。

java 信号量semaphore;true怎么理解

号量维护一个许可集,若有必要,会在获得许可之前阻塞每一个线程:

//从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。

acquireUninterruptibly(int permits){}

每一个release()添加一个许可,从而可能释放一个正在阻塞的获取者。

Semaphore只对可用许可的号码进行计数,并采取相应的行动。

如何获得Semaphore对象?

public Semaphore(int permits,boolean fair)

permits:初始化可用的许

如何用java实现信号量?

package synchronization;

public class Semaphore {

private int value;

public Semaphore(){

this.value = 0;

}

public Semaphore(int v){

this.value = v;

}

public synchronized void down(){

while(value = 0 ){

try{

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

value--;

}

public synchronized void up(){

value++;

notify();

}

}

使用的时候Semophore s;

while(true){

s.wait();

//临界区

s.signal();

}

java信号量的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java信号量机制、java信号量的信息别忘了在本站进行查找喔。