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. Why数学图像生成工具

    该软件能够以给定的数学公式及算法生成各种绚烂的数学图像.软件中有两种生成图像的方法: (1)通过一种我自定义的脚本语言生成: 软件中定义一套简单易学的脚本语言,用于描述数学表达式.使用时需要先要将数学 ...

  2. mac os x用macport安装redis

    一.Redis简要介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的 ...

  3. Oracle限制某个用户的连接数及PROFILE介绍

    限制一个用户的链接数,可以通过ORACLE的PROFILE文件来实现 1.     查看resource_limit参数: SQL> show parameter resource_limit ...

  4. Visual Studio 2010配置OpenGL-1.8

    参考博客 : 安装参考 1. http://blog.csdn.net/mooncircle/article/details/5545448 2. http://www.cnblogs.com/moo ...

  5. Github上的andoird开源组件整理

    http://blog.csdn.net/findsafety/article/details/50623627 第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListVie ...

  6. egit - not authorized

    A. To specify credentials individually for each remote Open Git repositories view, open "Remote ...

  7. 操作系统性能分析与优化V1.0

    操作系统性能分析与优化V1.0 : http://www.docin.com/p-759561760.html

  8. DVI-A、DVI-D、DVI-I接口定义、DVI接口图和DVI接口标准介绍

    http://blog.csdn.net/cd520yy/article/details/16993179

  9. u3d 性能优化

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  10. [Z] Windows 8/10 audio编程

    都是些网上搜到的比较不错的文章.关于这块儿的内容网上帖子不多.出去下面列的最主要的还有参考MSDN. WASAPI使用介绍: https://blogs.windows.com/buildingapp ...