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

网站备案个人可以做吗dw制作一个手机网站模板

网站备案个人可以做吗,dw制作一个手机网站模板,企业做网站好处,做得好的营销网站之前的文章中简单的为大家介绍了重入锁JAVA并发之多线程基础(2)。这里面也是简单的为大家介绍了重入锁的几种性质#xff0c;这里我们就去探索下里面是如何实现的。我们知道在使用的时候#xff0c;必须锁先有定义#xff0c;然后我们再拿着当前的锁进行加锁操作#xff0c…之前的文章中简单的为大家介绍了重入锁JAVA并发之多线程基础(2)。这里面也是简单的为大家介绍了重入锁的几种性质这里我们就去探索下里面是如何实现的。我们知道在使用的时候必须锁先有定义然后我们再拿着当前的锁进行加锁操作然后处理业务最后是释放锁的操作(这里就拿里面非公平锁的实现来讲解)。字节码操作public class com.montos.lock.ReentrantLockDemo implements java.lang.Runnable {public static java.util.concurrent.locks.ReentrantLock lock;public static int k;public com.montos.lock.ReentrantLockDemo();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.:()V4: returnpublic void run();Code:0: iconst_01: istore_12: iload_13: sipush 10006: if_icmpge 29 //int类型的值进行栈顶比较9: getstatic #2 // Field lock:Ljava/util/concurrent/locks/ReentrantLock;12: invokevirtual #3 // Method java/util/concurrent/locks/ReentrantLock.lock:()V15: getstatic #4 // Field k:I18: iconst_119: iadd20: putstatic #4 // Field k:I23: iinc 1, 126: goto 229: iconst_030: istore_131: iload_132: sipush 100035: if_icmpge 5038: getstatic #2 // Field lock:Ljava/util/concurrent/locks/ReentrantLock;41: invokevirtual #5 // Method java/util/concurrent/locks/ReentrantLock.unlock:()V44: iinc 1, 147: goto 3150: returnpublic static void main(java.lang.String[]) throws java.lang.InterruptedException;Code:0: new #6 // class com/montos/lock/ReentrantLockDemo3: dup4: invokespecial #7 // Method :()V7: astore_18: new #8 // class java/lang/Thread11: dup12: aload_113: invokespecial #9 // Method java/lang/Thread.:(Ljava/lang/Runnable;)V16: astore_217: new #8 // class java/lang/Thread20: dup21: aload_122: invokespecial #9 // Method java/lang/Thread.:(Ljava/lang/Runnable;)V25: astore_326: aload_227: invokevirtual #10 // Method java/lang/Thread.start:()V30: aload_331: invokevirtual #10 // Method java/lang/Thread.start:()V34: aload_235: invokevirtual #11 // Method java/lang/Thread.join:()V38: aload_339: invokevirtual #11 // Method java/lang/Thread.join:()V42: getstatic #12 // Field java/lang/System.out:Ljava/io/PrintStream;45: getstatic #4 // Field k:I48: invokevirtual #13 // Method java/io/PrintStream.println:(I)V51: returnstatic {};Code:0: new #14 // class java/util/concurrent/locks/ReentrantLock3: dup4: invokespecial #15 // Method java/util/concurrent/locks/ReentrantLock.:()V7: putstatic #2 // Field lock:Ljava/util/concurrent/locks/ReentrantLock;10: iconst_011: putstatic #4 // Field k:I14: return}复制代码这里面无非就是入栈栈元素比较出栈放入变量中这些操作没有之前的synchronized里面的监视器相关指令限制只是简单的一些栈操作。加锁操作final void lock(){if (compareAndSetState(0, 1)) //将同步状态从0变成1 采用cas进行更新setExclusiveOwnerThread(Thread.currentThread());//设置当前拥有独占访问权的线程。elseacquire(1);//没有获取到锁则进行尝试操作}复制代码往下面的选择走public final void acquire(int arg){//先进行再次尝试获取锁的操作如果获取失败则将当前加入队列中并设置中断标志。if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}复制代码首先走尝试获取锁的操作(这里还是走非公平锁的):final boolean nonfairTryAcquire(int acquires){final Thread current Thread.currentThread();//拿到当前线程int c getState();//同步状态if (c 0) {//再次做获取锁的操作if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current getExclusiveOwnerThread()) {//是否是当前线程已经占有int nextc c acquires;//原本的状态数值当前传入数值if (nextc 0) // overflowthrow new Error(Maximum lock count exceeded);setState(nextc);//设置新的状态return true;}return false;}复制代码接着往下走:private Node addWaiter(Node mode){//独占模式进行封装当前线程Node node new Node(Thread.currentThread(), mode);Node pred tail;if (pred ! null) {如果尾节点不为null将当前的节点接入并返回node.prev pred;if (compareAndSetTail(pred, node)) {pred.next node;return node;}}enq(node);return node;}复制代码继续往下走private Node enq(final Node node){for (;;) {//Node t tail;if (t null) { // 初始化尾节点if (compareAndSetHead(new Node()))tail head;} else {node.prev t;if (compareAndSetTail(t, node)) {//尾节点与当前的节点互换t.next node;return t;//返回当前节点}}}}复制代码接着回去往下走:final boolean acquireQueued(final Node node, int arg){boolean failed true;try {boolean interrupted false;for (;;) {final Node p node.predecessor();if (p head tryAcquire(arg)) {//如果当前节点前一个节点是头节点并尝试获锁成功setHead(node);//设置当前的头结点p.next null; // 手动清除引用 帮助GCfailed false;return interrupted;}//检测获取锁失败的节点状态 以及暂时挂起并返回当前的中断标志if (shouldParkAfterFailedAcquire(p, node) parkAndCheckInterrupt())interrupted true;}} finally {if (failed)cancelAcquire(node);//取消正在进行的获取尝试。}}复制代码说真的咱们直接看失败的情况我们接着往下走:private static boolean shouldParkAfterFailedAcquire(Node pred, Node node){//检查和更新无法获取的节点的状态。int ws pred.waitStatus;if (ws Node.SIGNAL)//该节点已经设置了请求释放信号状态所以可以进行安全挂起return true;if (ws 0) {do {//清除不需要执行的节点node.prev pred pred.prev;} while (pred.waitStatus 0);pred.next node;} else {//waitstatus必须为0或传播。表明我们需要信号但不要挂起。调用者重试以确保在挂起前无法获取。compareAndSetWaitStatus(pred, ws, Node.SIGNAL);}return false;}复制代码然后看向下一个方法private final boolean parkAndCheckInterrupt(){LockSupport.park(this);//挂起当前线程return Thread.interrupted();//返回中断标识}复制代码上面的取消获取队列里面的节点就不看了..cancelAcquire(node)里面就是取消正在进行的获取尝试。同时将无需的节点移除。当上面的操作走完之后就设置当前线程中断标识。这里面主要流程是说如果加锁不成功之后对于当前线程是怎么执行操作的我们可以看到里面的方法中大部分在获取不到锁之后下一步操作中会再次尝试获取下如果获取不到才会继续执行获取到了我们就可以直接使用这里也是多线程操作里面的魅力每一个空隙中就可能会让当前线程进行获得锁的操作。释放锁操作释放锁的步骤就简单许多了public final boolean release(int arg){if (tryRelease(arg)) {//尝试释放锁Node h head;if (h ! null h.waitStatus ! 0)unparkSuccessor(h);//唤醒节点的后续节点return true;}return false;}复制代码咱们继续往下看protected final boolean tryRelease(int releases){int c getState() - releases;//同步状态-当前释放状态值if (Thread.currentThread() ! getExclusiveOwnerThread())//如果当前线程不是拿锁线程则报监视器相关错误throw new IllegalMonitorStateException();boolean free false;if (c 0) {free true;//只有当前重入次数为0才能返回truesetExclusiveOwnerThread(null);//当前独占线程设为NULL}setState(c);//重新设置同步状态return free;}复制代码然后往下走:private void unparkSuccessor(Node node){//当前状态为负数则尝试清除当前的线程状态int ws node.waitStatus;if (ws 0)compareAndSetWaitStatus(node, ws, 0);//清除取消或无效的节点从尾部向后移动以找到实际节点Node s node.next;if (s null || s.waitStatus 0) {s null;for (Node t tail; t ! null t ! node; t t.prev)if (t.waitStatus 0)s t;}if (s ! null)LockSupport.unpark(s.thread);//释放当前线程}复制代码从上面的顺序往下面来看我们主要发现线程在拿锁阶段是有许多的操作的要根据线程的状态再将线程从等待队列中移除。释放的时候就显得简洁了许多我们只需要看到当前线程的状态-1然后看看是否是重入的。我们通过一个简单的重入锁代码可以看到作者在用无锁的操作去获得锁这个整体的步骤里面考虑的东西很多每一个时刻线程都有可能千变万化我们需要了解的是我们每一个步骤都需要可能发生的情况。如果能够考虑到发生的情况那么有些步骤就可以直接跳过我们直接就可以获得最后的结果(这块在线程尝试获锁的阶段可以体现)。有小伙伴对于重入锁还有什么看法的可以在下面进行留言我们可以相互学习共同进步~
http://www.zqtcl.cn/news/202181/

相关文章:

  • 如何识别一个网站是否做的好坏新河官网
  • 深圳网站建设 卓教育直播网站开发
  • 如何修改网站后台密码河南省罗山县做网站的公司
  • 个人网站免费源码大全湖南长沙新增病例最新消息
  • 途牛网站开发需求邯郸市中小学健康管理平台登录
  • 青岛商城网站开发年度关键词有哪些
  • 电商网站开发文献综述网站文案优化
  • 兼职工厂网站建设万维网的代表网站
  • 企业要建设一个网站需要多少钱网站制作的关键技术
  • 大连住房和城乡建设网站工程公司取名字大全
  • 自建网站投放广告网页设计色彩搭配
  • 网站建站公司哪家价钱合理seo优化是什么职位
  • 德州建设网站网络营销推广方式
  • 网站建设经费预算策划书河南省城乡建设厅网站
  • 校园二手网站开发与设计任务书wordpress 分类名称
  • 高端网站建设那公司好简约网站设计欣赏
  • 域名的网站建设方案书wordpress图片插件
  • 哪个网站做的w7系统好百度网络营销的概念
  • 哪里接单做网站怎么个人网站设计
  • 乐陵seo网站优化网站后期维护是做什么
  • 网站导航html源码网站编辑的工作职能有哪些
  • 品牌网站建设网wordpress密码保护文章
  • 体彩网站开发网站建设备案流程图
  • 云南网站建设天度网页界面设计遵循的原则
  • dede多个网站怎么做wordpress+adsense主题
  • 如何做网站营销江苏网站建设系统服务
  • 公司网站需要备案网络设置怎么设置
  • 网站正在建设中中文模板廊坊网站优化
  • 8免费网站建站网页网站模板
  • 网站开发算法面试滨州建设工程备案网站