文档章节

Semaphore的使用

ShortHand
 ShortHand
发布于 2016/09/26 23:36
字数 393
阅读 18
收藏 0

1. Semaphore介绍:

Semaphore (信号量)从概念上讲维护了一个许可集. 在获取acquire()到许可之后才能执行任务,每获取一次许可,许可数-1,在线程释放release()之后许可数+1。Semaphore就是根据许可数来控制线程并发执行的。为了更加形象说明Semaphore作用,这里举一个例子如下:


2. Semaphore的简单用法:

Run.java

package com.test.semaphore;

/**
 * Created by famiover on 16/9/26.
 */
public class Run {
    public static void main(String[] args) {
        Service service = new Service();
        for (int i = 0; i < 100; i++) {
            MyThread myThread = new MyThread(service);
            myThread.setName("Thread" + i);
            myThread.start();
        }
    }
}

Mythread.java

package com.test.semaphore;


/**
 * Created by famiover on 16/9/26.
 */
public class MyThread extends Thread {
    private Service service;
    public MyThread(Service service){
        this.service=service;
    }
    @Override
    public void run(){
      service.doSomething();
    }
}

Service.java

package com.test.semaphore;


/**
 * Created by famiover on 16/9/26.
 */
public class Service {
    public static int count=0;
    public void doSomething(){
        System.out.println(Thread.currentThread().getName()+"得到的count:"+getCount());
        setCount();
    }
    public int getCount(){
        return count;
    }
    public void setCount(){
        count++;
    }
}

结果如下:

运行结果

从结果可以看出多线程并发方法造成数据并非递增的现象。这里可以使用Semaphore 改造一下*** Service.java ***就可以得到期望的结果:

package com.test.semaphore;

import java.util.concurrent.Semaphore;

/**
 * Created by famiover on 16/9/26.
 */
public class Service {
    private Semaphore semaphore=new Semaphore(1);
    public static int count=0;
    public void doSomething(){
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"得到的count:"+getCount());
        setCount();

        semaphore.release();
    }
    public int getCount(){
        return count;
    }
    public void setCount(){
        count++;
    }
}

3.Semaphore的常用方法:

方法作用
acquire从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
tryAcquire从信号量尝试获取一个许可,如果无可用许可,直接返回false,不会阻塞。

© 著作权归作者所有

ShortHand
粉丝 3
博文 78
码字总数 16508
作品 0
静安
高级程序员
私信 提问
使用Semaphore限制资源并发访问的线程数

从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文将介绍用来控制资源同时访问个数的Semaphore工具类, 然后采用Semaphore给出一个泊车的实例,最后给出Semapho...

王孟君
2016/11/06
919
5
java.util.concurrent系列之--Semaphore

一、Semaphore用法 Semaphore ['seməfɔː] 信号 Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放...

来来来来来
2017/12/21
4
0
Object-C 多线程中锁的使用-NSLock

在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法。 一、使用synchronized方式 //线程1 dispatchasync(dispatchgetglobalqueue(DISPATCHQUEUEPRIOR...

sea_god
2014/08/18
0
0
Blocks与Dispatch Queue的使用

block是什么 block是一个C level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似。用于回调函数的地方。两个对象间的通讯。实现轻量级的“代理”。 blocks和C语言函数指针的区...

于赟
2012/10/30
0
1
Blocks与Dispatch Queue的使用

block是什么 block是一个C level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似。用于回调函数的地方。两个对象间的通讯。实现轻量级的“代理”。 blocks和C语言函数指针的区...

孙启超
2012/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RS-232、RS422和RS-485的区别和各自的实现方式

一、殊途同归 RS-232、RS422和RS-485 均属于UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),仅用两根信号线(Rx 和Tx)就可以完成通信过程; 而由于各自使用的电...

rainbowcode
29分钟前
0
0
spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true"/> 声明自动代理 2、AopContext.currentProxy()来获取代理类 3、使用代理类proxy进行代理调用内部声明了事务的方法 ......

重城重楼
35分钟前
5
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
47分钟前
3
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
58分钟前
2
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部