public class MyThreadTest {private final static Semaphore semaphore = new Semaphore(2);// 设置2个车位public static void main(String[] args) {System.out.println("start");p(semaphore, true, 1);p(semaphore, false, 2);p(semaphore, false, 3);p(semaphore, true, 4);p(semaphore, true, 5);System.out.println("end");}/*** 停车** @param semaphore 信号对象* @param enterInto 停车true/出库false* @param theCarNum 车辆序号*/private static void p(Semaphore semaphore, boolean enterInto, int theCarNum) {if (!enterInto) {try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}System.out.println("车辆出库");// 释放1个车位// 通过LockSupport.unpark(s.thread)来释放锁,详见AbstractOwnableSynchronizer.unparkSuccessorsemaphore.release(1);}try {// 如果达到设定的信号量,通过LockSupport.park(this)来释放锁,详见AbstractOwnableSynchronizer.parkAndCheckInterruptsemaphore.acquire();System.out.println("第 " + theCarNum + " 辆车进入");} catch (Exception e) {e.printStackTrace();}}/***     Semaphore中Sync继承了AbstractQueuedSynchronizer*     改变AbstractOwnableSynchronizer中state值(该值记录着剩余信号量)**     AbstractOwnableSynchronizer加载时会调用静态代码块获取state的偏移地址:*     stateOffset = unsafe.objectFieldOffset(AbstractQueuedSynchronizer.class.getDeclaredField("state"));*     上述获取对象某个变量的效率比使用反射获取的效率高**     protected final boolean compareAndSetState(int expect, int update) {*          // stateOffset为state变量的偏移地址*         return unsafe.compareAndSwapInt(this, stateOffset, expect, update);*     }*/}

  

原文:https://blog.csdn.net/qq_35001776/article/details/89158734

转载于:https://www.cnblogs.com/qbdj/p/10869946.html

Java并发Semaphore信号量的学习相关推荐

  1. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  2. 《Java并发编程实战》学习笔记

    什么是并发编程? 跳出来看全局就是3部分:分工.协作.互斥 钻进去看本质:技术的本质就是背后的理论模型 并发理论基础 并发编程产生bug的原因 可见性:cpu缓存导致共享变量在多核cpu的情况下,不可 ...

  3. Java并发教程–信号量

    这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入探讨Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章将介绍信号量-特别是对信号 ...

  4. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  5. Java并发编程 基础知识学习总结

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容,这部分的内容我也是反复学习了好几遍才能理解.本篇博客梳理一下最近从<Java 并发编程的艺术>和他人的博客学习Java并发 ...

  6. java并发编程之再学习

    java并发基础 Callable 首先我们来理一理Future和Runable的关系: public class FutureTask<V> implements RunnableFut ...

  7. Java并发编程-信号量

    Semaphore 直译是信号量,它的功能比较好理解,就是通过构造函数设定一个数量的许可,然后通过 acquire 方法获得许可,release 方法释放许可.它还有 tryAcquire 和 acq ...

  8. JAVA并发编程JUC基础学习(简介)

    2019独角兽企业重金招聘Python工程师标准>>> 之前写过一篇并发编程的简单实例应用,Future快速实现并发编程,可以很快的在自己的项目中应用,但并不系统,之前说过总结一篇( ...

  9. Java中Semaphore(信号量) 数据库连接池

    计数信号量用来控制同时访问某个特定资源的操作数或同时执行某个指定操作的数量 A counting semaphore.Conceptually, a semaphore maintains a set ...

最新文章

  1. IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)
  2. 艾伟:重提URL Rewrite(3):在URL Rewrite后保持PostBack地址
  3. CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB
  4. mysql映射超_Hibernate的映射类型 hibernate mysql映射类型
  5. 软件架构设计的三个维度,软件架构师需要知道的点,了解一下吧!
  6. Que2Search: Fast and Accurate Query and Document Understanding for Search at Facebook论文笔记
  7. CentOS7详细安装教程--图文介绍超详细
  8. Win7忘记开机密码解决办法
  9. 生物信息学名词解释 | K-mer (长度为k的短序列)
  10. MySQL: Incorrect string value: '\xF0\xA4\xBD\x82'分析解决
  11. 【用户投稿】优麒麟社区懒人版本(含软件全家桶)一键安装
  12. SharePoint Online:软件边界和限制
  13. 用python如何画出好看的地图
  14. 38、程序中的三国天下
  15. 模仿炉石传说的金卡效果
  16. Android 修改SIM卡默认VOLTE值
  17. 全网最详细,MySQL数据库知识总结,你要的我都有......
  18. Python实操 :破解密码
  19. 哪个线上打印平台属于24小时营业的打印店?
  20. 人工智能导论实验:产生式推理系统(Python+MySQL+tkInter)

热门文章

  1. SQL Server 2005 DTS导入平面数据
  2. [ SAP ]MM Valuation System
  3. 实现sessionfilter_session应用--采用filter和session实现简单用户权限控制
  4. java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...
  5. java星座查询系统_星座查询示例代码
  6. 控制台资费管理主菜单java_java毕业设计_springboot框架的高速公路收费管理系统...
  7. java rpg对战_RpgGame.java
  8. 中南大学在线考试答案计算机基础,中南大学《计算机基础》在线考试题库(267题)(有答案).doc...
  9. php 数组对比 unset,如何区分PHP中unset,array_splice的区别
  10. flex java 开发环境搭建_Flex+JAVA+BlazeDS开发环境配置(Java工程和Flex工程独立)