本篇文章为大家展示了如何解析Java中信号的信号量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
信号(信号量)是由计算机科学家迪杰斯特拉在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制。
信号也有被翻译成信号灯,因为其机制就像我们日常生活中的红绿灯,车辆的通行看红绿灯,对应编程世界的线程能不能执行得看信号灯!
信号用来多线程互斥问题,相对于同步和锁来说它允许多个线程访问一个临界区!例如各种池:数据库连接池,对象池等,这些池的需求就是同一时刻允许多个线程同时使用连接池。
<>强信号的模型可以概括为一个计数器,一个等待队列,三个方法。三个方法原子性分别是init(),(),(), 强>
init():设置计数器的初始值。
():将计数器的值减一,如果减了一之后,计数器的值小于0,则当前的线程被阻塞,否则继续执行。
():将计数器的值加一,如果加了一之后,计数器的值小于等于0,则唤醒等待队列中的一个线程,并且将它移除出等待队列。(<强>注意是小于等于0,不应该理解为大于等于0,因为大于等于0表明此时没有等待的线程,所以不会有唤醒这个操作。强>
如果你想多让几个线程进去临界区,那么就把信号量构造器中的1改为你想要的线程数。
可以理解为颁发许可证,比如想同时允许3个线程进入临界区,构造器中的数就填3,理解为搞了3张许可证,然后颁发出去,谁拿到了许可证谁就能进临界区,进入临界区后的线程搞完事了,就归还许可证,然后出去。
信号量的内部共存在同步,NonfairSync, FairSync三个类。
NonfairSync与FairSync类继承自同步类,同步类继承自AbstractQueuedSynchronizer抽象类,也就信号量是依托于NonfairSync, FairSync来实现的。
可以通过构造函数来指定为公平锁还是非公平锁,公平的意思这个许可只会给按先来后到的顺序给等待队列中的线程。而非公平的意思就是对于任何申请许可的线程,都第一时间看是否有多余的许可,如果有则给此线程。
差别就在于有没hasQueuedPredecessors(),这个方法就是判断当前线程是否是等待队列中的头结点,如果不是,则不给于分配。
上述内容就是如何解析Java中信号的信号量,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。