node

深入浅出多线程——ReentrantLock (一)

只谈情不闲聊 提交于 2019-12-09 10:59:25
  ReentrantLock是一个排它重入锁,与synchronized关键字语意类似,但比其功能更为强大。该类位于java.util.concurrent.locks包下,是Lock接口的实现类。基本用法如下: class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }   本文章会围绕核心方法lock(),unlock()进行分析。在开始之前,对部分概念进行阐述:   1,RenntrantLock是一个排它重入锁,重入次数为Integer.MAX_VALUE,其中通过构造实现两大核心(公平锁,非公平锁)。在默认情况下是非公平锁。   2,RenntrantLock的公平锁和非公平锁基于抽象类AbstractQueuedSynchornizer,简称AQS。在源码分析阶段,也会涉及该类相关的原理分析。更加详细的会在后续文章中单独说明。   3,AQS中涉及到了大量的Compare and swap操作,简称CAS

Lock的实现之ReentrantLock详解

丶灬走出姿态 提交于 2019-12-09 10:59:08
摘要 Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作; 虽然锁有很多实现,但是都依赖AbstractQueuedSynchronizer类,我们用ReentrantLock进行讲解; ReentrantLock调用过程 ReentrantLock类的API调用都委托给一个内部类 Sync ,而该类继承了 AbstractQueuedSynchronizer类; public class ReentrantLock implements Lock, java.io.Serializable { ...... abstract static class Sync extends AbstractQueuedSynchronizer { ...... 而Sync又分为两个子类:公平锁和非公平锁,默认为非公平锁 /** * Sync object for non-fair locks */ static final class NonfairSync extends Sync { /** * Sync object for fair locks */ static final class FairSync extends Sync { Lock的调用过程如下图(其中涉及到 ReentrantLock类、Sync(抽象类)

ReentrantLock实现原理深入探究

杀马特。学长 韩版系。学妹 提交于 2019-12-09 10:58:53
前言 这篇文章被归到Java基础分类中,其实真的一点都不基础。网上写ReentrantLock的使用、ReentrantLock和synchronized的区别的文章很多,研究ReentrantLock并且能讲清楚ReentrantLock的原理的文章很少,本文就来研究一下ReentrantLock的实现原理。研究ReentrantLock的实现原理需要比较好的Java基础以及阅读代码的能力,有些朋友看不懂没关系,可以以后看,相信你一定会有所收获。 最后说一句,ReentrantLock是基于AQS实现的,这在下面会讲到,AQS的基础又是CAS,如果不是很熟悉CAS的朋友,可以看一下这篇文章 Unsafe与CAS 。 AbstractQueuedSynchronizer ReentrantLock实现的前提就是AbstractQueuedSynchronizer,简称AQS,是java.util.concurrent的核心,CountDownLatch、FutureTask、Semaphore、ReentrantLock等都有一个内部类是这个抽象类的子类。先用两张表格介绍一下AQS。第一个讲的是Node,由于 AQS是基于FIFO队列的实现 ,因此必然存在一个个节点,Node就是一个节点,Node里面有: 属 性 定 义 Node SHARED = new Node()

获取验证码倒计时60s

送分小仙女□ 提交于 2019-12-09 10:05:20
< span class= "mui-btn mui-btn-link" id= "bindCardPay" > 获取验证码 </ span > <button id="btn" >获取验证码</button>- var test = { node : null , count : 60 , start : function () { if ( this . count > 0 ) { this . node . innerHTML = this . count -- + "秒后重新获取" ; var _this = this ; setTimeout ( function () { _this . start (); }, 1000 ); } else { this . node . removeAttribute ( "disabled" ); this . node . innerHTML = "重新获取" ; //120秒读完,变回开始背景颜色,在这里添加。 this . count = 60 ; } }, //初始化 init : function (node) { this . node = node; this . node . setAttribute ( "disabled" , true ); this . start (); } }; var btn =

配置React Native环境及解决运行异常

巧了我就是萌 提交于 2019-12-09 09:55:39
一. 安装 Homebrew : Homebrew的官网 (多语言版本)简单明了地介绍了如何安装和使用这个工具,;并提供了自己的Wiki。 brew的安装很简单,使用一条ruby命令即可,Mac系统上已经默认安装了ruby": ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 等待一段时间后会出现 Press RETURN to continue or any other key to abort 敲回车后提示输入你的电脑密码:(输入密码的过程中终端不会有任何变化) 输入密码后提示 Downloading and installing Homebrew... 继续耐心等待.. 二. 安装 Node.js : 使用 Homebrew 来安装nvm,watchman 和 flow.(建议每次用Homebrew的时候先更新brew,命令: brew update ) 1,安装nvm: 终端中输入: brew install nvm 最后终端会提示 大概意思就是如果没有.nvm文件的话就要创建一个,终端中输入 mkdir ~/.nvm 就可以创建.nvm文件了 ,然后去~/.bash_profile或者在shell的配置文件中配置如下内容: export NVM

'boost/iterator/iterator_adaptor.hpp' file not found之xcode生成时报错的解决方案

江枫思渺然 提交于 2019-12-09 09:54:28
xcode生成rn(0.49.3)项目的时候出现“'boost/iterator/iterator_adaptor.hpp' file not found之xcode”报错。 原因:    /Users/xxx/.rncache 中 boost_1_63_0.tar.gz, double-conversion-1.1.5.tar.gz, folly-2016.09.26.00.tar.gz, glog-0.3.4.tar.gz 文件下载不完整 解决方案:   1.点击下载.rncache完整包: 点击下载百度网盘 ;   2.解压上面下载的完整包,替换.rncache,具体步骤:打开Finder使用快捷键“Command+Shift+G”前往文件夹.rncache进行替换;   3.删除根目录node_modules,使用命令“npm i”重新安装node模块;   4.Clean & Build 使用Xcode重新生成项目; good luck~ 来源: https://www.cnblogs.com/vipstone/p/7840316.html

创建ReactNative的iOS项目

纵然是瞬间 提交于 2019-12-09 09:51:54
http://reactnative.cn/docs/integration-with-existing-apps/ 1.安装好ReactNative开发环境 2.安装好CocoaPods 3.创建项目根文件夹:A 4.创建文件夹A/ios 5.创建新项目到A/ios目录下(最上层目录移除,否则下面的路径需要修改,例如原来为ProjectDir/ProjectDir,但是根目录ProjectDir下只有一个文件夹,那么最上层移除,只要下一层包含项目数据文件的ProjectDir拷贝到A/ios文件夹下面即可) 6.根目录A下创建package.json和index.js(老版本index.ios.js)文件 { "name": "MyReactNativeApp", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start" } } 7.根目录A下执行$ yarn add react-native集成(以下两条命令是可以用npm替换yarn,如果网络问题出错如此) 8.控制台打印可能会出现警告类似warning "react-native@0.52.2" has unmet peer dependency

分享2个实用的nodejs模块

我怕爱的太早我们不能终老 提交于 2019-12-09 09:42:47
分享2个实用的nodejs模块 kp 根据端口号杀死进程,尤其对于pm2的集群模式,僵尸进程有效 mount-routes 根据路径来自动加载路由,让开发更简单 kp kp is a tool for kill process by server port. only use for mac && linux Install [sudo]npm install -g kp Usage default server port is 3000,直接执行kp会杀死使用3000端口的应用 kp 根据某个端口 kp 3002 支持sudo,因为有的时候有权限的问题 kp 3002 -s or kp 3002 --sudo 目前centos/ubuntu和mac已经测过 感谢@jysperm反馈:fuser 来自 psmisc 这个包(killall 也在这个包里),Ubuntu 默认安装,其他系统不清楚。 没有使用fuser的原因是:fuser在mac上不能用 mount-routes mount-routes = auto mount express routes with routes_folder_path Install npm install --save mount-routes Usages var express = require('express') var app =

Node.js实战1:创建一个新的Node项目。

六月ゝ 毕业季﹏ 提交于 2019-12-09 08:06:28
你也许在猜专业的Node开发如何创建一个新项目。 有Npm在 ,这会非常简单。 虽然你可以创建一个JS文件,并执行:node file.js,但我建议你使用npm init来先创建一个node项目,这会是非常好的习惯。 cmd下执行: npm init 即可创建一个Node项目。这时会产生一个package.json文件。这是node的清单文件, package.json里面,会包含该项目的基本信息,以及项目所需要的三方模块信息。 这个文件是很有用的,当将来此项目要在别的机器上使用时,依赖它可以实现快速安装部署。 参考资料: 创建Node项目,这是入门Node开发的第一步。 来源: https://www.cnblogs.com/w2sft/p/12008917.html

掌握 Ajax,第 5 部分:操纵 DOM

一世执手 提交于 2019-12-09 07:58:33
Brett McLaughlin , 作者,编辑, O'Reilly Media Inc. 2006 年 4 月 27 日 如果阅读过本系列的 上一篇文章 ,那么您就非常清楚当 Web 浏览器显示网页时幕后发生的一切了。前面已经提到,当 HTML 或为页面定义的 CSS 发送给 Web 浏览器时,网页被从文本转化成对象模型。无论代码简单或复杂,集中到一个文件还是分散到多个文件,都是如此。然后浏览器直接使用对象模型而不是您提供的文本文件。浏览器使用的模型称为 文档对象模型(Document Object Model,DOM) 。它连接表示文档中元素、属性和文本的对象。HTML 和 CSS 中所有的样式、值、甚至大部分空格都合并到该对象模型中。给定网页的具体模型称为该页面的 DOM 树 。 了解什么是 DOM 树,以及知道它如何表示 HTML 和 CSS 仅仅是控制 Web 页面的第一步。接下来还需要了解如何处理 Web 页面的 DOM 树。比方说,如果向 DOM 树中增加一个元素,这个元素就会立即出现在用户的 Web 浏览器中 —— 不需要重新加载页面。从 DOM 树中删除一些文本,那些文本就会从用户屏幕上消失。可以通过 DOM 修改用户界面或者与用户界面交互,这样就提供了很强的编程能力和灵活性。一旦学会了如何处理 DOM 树,您就向实现丰富的、交互式动态网站迈出了一大步。 注意