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

最好的建站平台云邮企业邮箱官网

最好的建站平台,云邮企业邮箱官网,网站怎么做站长统计,网站开发实现的环境文章目录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.pierceye.com/news/240175/

相关文章:

  • 电子商务网站建设与管理教材评价织梦网站地图调用全站文章
  • 020网站开发多少钱汕尾建设网站首页
  • 桓台县建设局网站做弹幕网站有哪些
  • 淘宝客导购网站源码iis默认网站属性
  • 做网站用矢量图还是位图安徽省住房和建设厅网站
  • 彭阳网站建设多少钱嘉兴专业的嘉兴专业网站建设项目
  • 网站建设导航分哪几类公司网站大全
  • 网站建设 实训题安能建设总公司网站打不开
  • 莱西网站建设龙岗中心城有学网站建设
  • 重庆技术网站建设宝安做网站哪家好
  • 仿制网站建设写网站建设的软文
  • 0基础网站建设教程wordpress去掉rss订阅
  • 爱网站查询外贸推广具体是做什么
  • 商务网站价格找人做效果图那个网站
  • 上传到网站租一个服务器要多少钱
  • 网站制作服务合同安徽建设工程信息网文件
  • 成都企业网站建设公司正规的跨境电商平台有哪些
  • 中山工程建设信息网站网站监控系统
  • 个人网站想添加支付功能怎么做北京二次感染最新消息
  • 上海注册汽车租赁公司网站模板对seo的影响
  • 上海松江做网站公司wordpress 网站暂停
  • 太仓苏州网站建设网站的规划与建设课程设计
  • 遵义住房城乡建设厅网站电子商务网店毕业设计
  • 惠州市博罗县建设局网站防静电产品东莞网站建设技术支持
  • 茂名整站优化百度一下 你知道首页
  • 郑州网站微信微博维护品牌网站建设流程图
  • 网站建站销售怎么做做门窗安装去哪些网站找生意
  • 太原建站司点击查看荆州网站开发
  • 个人音乐网站开发宁波网站推广工作室电话
  • 建设部网站 造价工程师wordpress忘了秘密