当前位置: 首页 > news >正文

山东企业建站系统费用抚宁区建设局网站

山东企业建站系统费用,抚宁区建设局网站,江西中赣建设有限公司网站,ae模板免费网站文章目录1:官方解读2:通俗易懂的例子解析3:代码解析4:Semaphore的应用5:类结构和相关方法(1):类结构(2):acquire()方法(3):release()方法6:总结1:官方解读 semaphore信号量就是并发工具类,Semaphore管理着一组许可permit#xff0c;许可的初始数量通过构造函数设定。 当线程要… 文章目录1:官方解读2:通俗易懂的例子解析3:代码解析4:Semaphore的应用5:类结构和相关方法(1):类结构(2):acquire()方法(3):release()方法6:总结1:官方解读 semaphore信号量就是并发工具类,Semaphore管理着一组许可permit许可的初始数量通过构造函数设定。 当线程要访问共享资源时需要先通过acquire()方法获取许可。获取到之后许可就被当前线程占用了在归还许可之前其他线程不能获取这个许可。调用acquire()方法时如果没有许可可用了就将线程阻塞等待有许可被归还了再执行。 当执行完业务功能后需要通过release()方法将许可证归还以便其他线程能够获得许可证继续执行。 2:通俗易懂的例子解析 我们假设停车场仅有3个停车位停车位就是有限的共享资源许可数为3。一开始停车场没有车辆所有车位全部空着然后先后到来三辆车停车场车位够安排进去停车。之后来的车必须在外面候着直到停车场有空车位。当停车场有车开出去里面有空位了则安排一辆车进去至于是哪辆要看选择的机制是公平还是非公平。 从程序角度看停车场就相当于有限的公共资源许可数为3车辆就相当于线程。当来一辆车时许可数就会减1当停车场没有车位了许可数为0其他来的车辆需要在外面等候着。如果有一辆车开出停车场许可数1然后放进来一辆车。 3:代码解析 public static void main(String[] args) {Semaphore semaphore new Semaphore(3);for (int i 0; i 10; i) {new Thread(()-{try {semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();}try {System.out.println(Thread.currentThread().getName()开始执行);Thread.sleep(1000);System.out.println(Thread.currentThread().getName()执行完毕);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}).start();}}4:Semaphore的应用 Semaphore可以用于做流量控制特别是公共资源有限的应用场景比如数据库连接。假如有多个线程读取数据后需要将数据保存在数据库中而可用的最大数据库连接只有10个这时候就需要使用Semaphore来控制能够并发访问到数据库连接资源的线程个数最多只有10个。在限制资源使用的应用场景下Semaphore是特别合适的。 5:类结构和相关方法 (1):类结构 Semaphore同样是由AQS实现的用内部类Sync来管理锁Sync有两个实现分别为NonfairSync非公平锁和FairSync公平锁。 这个类结构有没有似曾相识的感觉重入锁ReentrantLock也是同样的类结构Semaphore的源码跟ReentrantLock有很多相似但又比ReentrantLock简单。 (2):acquire()方法 acquire()方法就是获取许可获取到许可就可以继续执行访问共享资源获取不到就阻塞等待其他线程归还许可。 入队操作 private void doAcquireSharedInterruptibly(int arg)throws InterruptedException {final Node node addWaiter(Node.SHARED);boolean failed true;try {for (;;) {final Node p node.predecessor();if (p head) {int r tryAcquireShared(arg);if (r 0) {setHeadAndPropagate(node, r);p.next null; // help GCfailed false;return;}}if (shouldParkAfterFailedAcquire(p, node) parkAndCheckInterrupt())throw new InterruptedException();}} finally {if (failed)cancelAcquire(node);}}(3):release()方法 release()方法归还许可其实就是将AQS.state加1。归还成功唤醒AQS队列中等锁的线程从被阻塞的位置开始执行。 public final boolean releaseShared(int arg) {if (tryReleaseShared(arg)) {//释放放完毕后 doReleaseShared();// 要去唤醒新的结点线程return true;}return false;}去释放结点 protected final boolean tryReleaseShared(int releases) {for (;;) {int current getState();int next current releases;if (next current) // overflowthrow new Error(Maximum permit count exceeded);if (compareAndSetState(current, next))return true;}}去唤醒结点 private void doReleaseShared() {for (;;) {Node h head;if (h ! null h ! tail) {int ws h.waitStatus;//获取结点的状态 为-1表示的是等待状态if (ws Node.SIGNAL) {if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0))continue; // loop to recheck casesunparkSuccessor(h);}else if (ws 0 !compareAndSetWaitStatus(h, 0, Node.PROPAGATE))continue; // loop on failed CAS}if (h head) // loop if head changedbreak;}}6:总结 信号量Semaphore用于控制资源能够被并发访问的线程数量以保证多个线程能够合理的使用特定资源比如数据库连接等。 Semaphore在构造时设置一个许可数量这个许可数量用AQS.state来记录。 acquire()方法就是获取许可只有获取到许可才可以继续执行访问共享资源获取到许可之后AQS.state减1以记录当前可用的许可数量如果获取不到许可线程就阻塞等待其他线程归还许可。 release()方法将许可归还AQS.state加1归还之后唤醒AQS队列中阻塞的线程获取许可。
http://www.zqtcl.cn/news/902706/

相关文章:

  • 周到的商城网站建设北京品牌网站
  • 网站开发费用属于什么科目网站建设考试多选题
  • c asp做网站wordpress4.5.2文章采集
  • 百度网站建设电话建立网站站建设可以吗
  • 网站后台代码在哪修改网站如何做下一页
  • 网站开发职业要求百度推广代理商与总公司的区别
  • 西安网站建设中心网页 网 址网站区别
  • 技术支持东莞网站建设机械seo岗位是什么意思
  • 做商城网站需要备案什么域名硬件开发工具有哪些
  • 网络网站制作技巧wordpress全文
  • 韩国原生ip站群服务器左右悬停代码网站
  • 专门做广东11选5的网站网站 备案 营业执照
  • 免费扑克网站wordpress弹出服务协议窗口
  • 网站的反爬一般怎样做网站右键屏蔽
  • 茂名做网站dyiee青岛宣传片制作公司
  • 凡科网可以自己做网站吗编程常用网站
  • 做网站练手项目公司营业执照可以做几个网站
  • 聚通达网站建设网站并发要求
  • 网站建设预算申请如何写服装店网页设计素材
  • 做网站设计的公司柳州芜湖又出现一例
  • 重庆网站网站建设东莞市网站建设公司哪家好
  • php做网站如何架构wordpress 排版
  • wordpress免费网站模板下载地址在北京注册公司需要多少钱
  • 做的网站打不开高端网站名字
  • 个人网站建设报告西安网站开发高端网站开发
  • “网站建设:上海珍岛”网站备案信息查询系统
  • 北京哪个公司做网站专业建站培训
  • 郑州知名网站推广网站管理设置
  • 建设工程网站资质人员查询常州模板网站建设价格
  • 自己建网站做app手机网站列表页源码