Java中在控制多线程访问资源的时候使用了信号量可以控制多个线程同时访问一个资源。

有两个构造方法:

public Semaphore(int permits)

public Semaphore(int permits,boolean fair)

第二个参数和重入锁一样,是指定是否公平。(公平是要牺牲性能的)

 public class SignalNum implements Runnable {
Semaphore semaphore=new Semaphore(2); @Override
public void run() {
try {
semaphore.acquire();
for(int i=1;i<10;i++){
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+":done"+i);
} semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args){
SignalNum signalNum=new SignalNum();
Thread t1=new Thread(signalNum,"t1");
Thread t2=new Thread(signalNum,"t2");
Thread t3=new Thread(signalNum,"t3"); t1.start();
t2.start();
t3.start();
}
}

这个例子的是指定了一次可以运行2的信号量,之后的执行结果为:

D:\Java\jdk1.7.0_45\bin\java -Didea.launcher.port=7535 "-Didea.launcher.bin.path=D:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Java\jdk1.7.0_45\jre\lib\charsets.jar;D:\Java\jdk1.7.0_45\jre\lib\deploy.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\dnsns.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\jaccess.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\localedata.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\sunec.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.7.0_45\jre\lib\ext\zipfs.jar;D:\Java\jdk1.7.0_45\jre\lib\javaws.jar;D:\Java\jdk1.7.0_45\jre\lib\jce.jar;D:\Java\jdk1.7.0_45\jre\lib\jfr.jar;D:\Java\jdk1.7.0_45\jre\lib\jfxrt.jar;D:\Java\jdk1.7.0_45\jre\lib\jsse.jar;D:\Java\jdk1.7.0_45\jre\lib\management-agent.jar;D:\Java\jdk1.7.0_45\jre\lib\plugin.jar;D:\Java\jdk1.7.0_45\jre\lib\resources.jar;D:\Java\jdk1.7.0_45\jre\lib\rt.jar;E:\JavaIDEA\TestJavaThread\out\test\test;D:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain SignalNum
t1:done1
t2:done1
t1:done2
t2:done2
t1:done3
t2:done3
t1:done4
t2:done4
t1:done5
t2:done5
t1:done6
t2:done6
t1:done7
t2:done7
t1:done8
t2:done8
t1:done9
t2:done9
t3:done1
t3:done2
t3:done3
t3:done4
t3:done5
t3:done6
t3:done7
t3:done8
t3:done9

Process finished with exit code 0

我们可以看到t1 t2两个线程可以执行,然后t3等到了两个线程执行完成之后才能执行。

信号量是用来同步数据的。

然而在同时获得的资源会不会线程安全呢?我做了测试让3个线程同时获得资源然后各自加10000次,我发现了会有小于30000次的情况,说明同时获得资源的线程是线程不安全的,所以就算使用了信号量,还是要加锁。在这里我认为使用重入锁更加恰当,如果使用synchronized那么同时获得资源就没有意义了。

Java多线程学习笔记——信号量的使用的更多相关文章

  1. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  2. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  3. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  4. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  5. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  6. java 多线程学习笔记

    这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...

  7. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

  8. java多线程学习笔记(三)

    java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现“脏读”的现象,这个时候需要“临界区”的出现去解决多线程的安全的并发访问.(这个“脏读”的现 ...

  9. Java多线程学习笔记(一)

    一 概述 一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建. package link.summer7c.test; public class ...

随机推荐

  1. How to apply Local Group Policy settings silently using the ImportRegPol.exe and Apply_LGPO_Delta.exe utilities.

    参考:http://supportishere.com/how-to-apply-local-group-policy-settings-silently-using-the-importregpol ...

  2. redis一句话

  3. Spark核心—RDD初探

    本文目的     最近在使用Spark进行数据清理的相关工作,初次使用Spark时,遇到了一些挑(da)战(ken).感觉需要记录点什么,才对得起自己.下面的内容主要是关于Spark核心-RDD的相关 ...

  4. Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. Android防止按钮连续点击

    为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击. public class Utils { private static long lastClickTime; publ ...

  6. selenium实战练习之:粉丝反馈表单的自动化脚本

    链接 粉丝反馈表 要求 服务质量5颗星 喜欢的内容选择各种公开课 对交流群的意见需要填写 留下自己正确的联系方式 点击提交 断言 不需要断言,能符合上面的要求成功提交就可以

  7. 【转】drupal7请求异常,执行时间过长的解决方法

    drupal7请求错误,执行时间过长的解决办法 根据你的系统或网络设置Drupal不能读取网页,造成功能缺失.可能是web服务器配置或PHP设置引起的,可用更新.获取更新源.使用OpenID登 录或使 ...

  8. Java历史版本下载

    下载个以前版本的Java工具不容易.Java SE 6 版本拿去: http://www.oracle.com/technetwork/java/javasebusiness/downloads/ja ...

  9. GNU风格 ARM汇编语法指南

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 1.  GNU汇编语言语句格式 任何Linux汇编 ...

  10. js 与或运算符 || && 妙用

    js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性.   首先出个题: 如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: ...