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. 机器学习基石--学习笔记01--linear hard SVM

    背景 支持向量机(SVM)背后的数学知识比较复杂,之前尝试过在网上搜索一些资料自学,但是效果不佳.所以,在我的数据挖掘工具箱中,一直不会使用SVM这个利器.最近,台大林轩田老师在Coursera上的机 ...

  2. SSH使用教程( Bitvise Tunnelier+Chrome+Proxy Switchy)

    前言 网上很多讲解使用Bitvise Tunnelier+Chrome+Proxy Switchy进行SSHFQ操作的教材有所缺失的部分,不太全面,这里重新整理. 本篇博客的主要内容如下: 准备工作 ...

  3. 2015想做O2O?那就来看看O2O报告!

    来源:互联网

  4. android:layout_weight

    layout_weight 用于给一个线性布局中的诸多视图的重要度赋值. 所有的视图都有一个layout_weight值,默认为零,意思是需要显示多大的视图就占据多大的屏幕空 间.若赋一个高于零的值, ...

  5. 使用 T-SQL 计算当日日期、本周第一天与最后一天

    --当日日期 ); SET @Today = DATENAME(YEAR, GETDATE()) + '-' + DATENAME(MONTH, GETDATE()) + '-' + DATENAME ...

  6. T-SQL 小数点转换百分数

    -- ============================================= -- Author: <Author,,CC> -- Create date: <C ...

  7. HBase修改压缩格式及Snappy压缩实测分享

    一.要点 有关Snappy的相关介绍可参看Hadoop压缩-SNAPPY算法,如果想安装Snappy,可以参看Hadoop HBase 配置 安装 Snappy 终极教程. 1. HBase修改Tab ...

  8. 一种线程安全的handle

    对象引用的正确性在多线程环境下是一个复杂的问题,请参考,处理由引用计数引起的泄漏.简单来说,我们应该尽量减少使用强引用,否则将有可能产生[处理由引用计数引起的泄漏]一文中描述的难以察觉的内存泄漏问题. ...

  9. Java开发者值得关注的7款新工具

    云计算.大数据地快速发展催生了不少热门的应用及工具.作为老牌语言Java,其生态圈也出来了一些有关云服务.监控.文档分享方面的工具.本文总结了7款较新的Java工具,大家不妨看下. 1. JClari ...

  10. JS - IE or not:判断是否为IE浏览器方法

    问题:使用JS判断是否为IE浏览器 方法: 1.IE='\v'=='v'  (失败!) if('\v'=='v') // true only in IE 2.IE=(!+"\v1" ...