next

Java并发编程笔记之ConcurrentLinkedQueue源码探究

拥有回忆 提交于 2020-08-11 19:45:20
JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全? ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构是使用单向链表实现,入队和出队操作是使用我们经常提到的CAS来保证线程安全的。 我们首先看一下ConcurrentLinkedQueue的类图结构先,好有一个内部逻辑有一个大概的印象,如下图所示: 可以清楚的看到ConcurrentLinkedQueue内部的队列是使用单向链表方式实现,类中两个volatile 类型的Node 节点分别用来存放队列的首位节点。 首先我们先来看一下ConcurrentLinkedQueue的构造函数,如下: public ConcurrentLinkedQueue() { head = tail = new Node<E>( null ); } 通过无参构造函数可知默认头尾节点都是指向 item 为 null 的哨兵节点。 Node节点内部则维护一个volatile 修饰的变量item 用来存放节点的值,next用来存放链表的下一个节点,从而链接为一个单向无界链表,这就是单向无界的根本原因。如下图: 接下来看ConcurrentLinkedQueue 主要关注入队

Python :生成器(generator) 上

有些话、适合烂在心里 提交于 2020-08-11 19:34:31
在Python当中吗,生成器是一种比较特殊的数据结构,也是十分常见的数据结构,它和列表推倒式的书写方法一致,只是最外面的列表中括号被替换成了括号。凡是最外面是括号的推倒式则是生成器,在生成器当中我们不能够像列表一样通过索引得到一个元素的信息,而是需要调用__next__()方法或者next()方法才能得到生成器元素当中的信息。下面是一个简单的列表推倒式,我们和生成器对比对比: list = [x*3 for x in range(10 )] print ( " 列表推倒式得到的结果是: " ) print (list) print () 输出: 列表推倒式得到的结果是: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27] 然后下面是生成器的代码: generator = (x*3 for x in range(10 )) print (type(generator)) # 生成器的type print (generator) # 直接打印生成器,不能像列表一样直接得到列表的结果 得到: < class ' generator ' > <generator object <genexpr> at 0x000001A0073E04C8> 调用生成器当中的方法,实现提提取生成器当中的信息: # 方法一:调用__next__()方法打印出生成器当中的信息 print

Verilog -- 序列模三(整除3)检测器

懵懂的女人 提交于 2020-08-11 19:04:42
Verilog -- 序列模三(整除3)检测器 描述:输入口是1bit,每次进来一位数据,检查当前序列是否能整除3,能则输出1,否则输出0. 例如 : 序列=1,out=0; 序列=11,out=1; 序列=110,out=1; 序列=1101,out=0; 首先需要找一下规律 ,一个数被三除,只可能会有三种情况: 1.余数为0; 2.余数为1; 3.余数为2; 假设当前序列表示的数是x,商为a,余数为b, 则有: \[3a+b = x \] 需要注意的是:当新进来1bit数据时,实际上隐含了一个条件就是序列将被左移,也就是说如果当前序列为 \(x\) ,输入数据为0,则此时序列表示的数是 \(2x\) ,如果输入是1,则此时序列表示 \(2x+1\) . 下面分类讨论: 余数为0的情况,也就是 \(3a=x\) : 输入为0,因为之前余数为0表示已经能整除3,这时输入为0相当于序列乘上个2,仍然能被3整除,输出为1; 输入为1,则有 \(6a+1=2x\) ,可见此时余数为1; 余数为1的情况,也就是 \(3a+1=x\) : 输入为0,则有 \(6a+2=2x\) ,可见此时余数为2; 输入为1,则有 \(6a+3=2x+1\) ,此时序列可以被三整除,可见此时余数为0,输出为1; 余数为2的情况,也就是 \(3a+2=x\) : 输入为0,则有 \(6a+4=2x\)

【融职培训】Web前端学习 第9章 教务管理系统开发5 前端代码讲解

爷,独闯天下 提交于 2020-08-11 18:56:28
一、导航守卫 导航守卫主要用于实现在页面发生跳转时,检测token的存在,如果token没有或失效,网页则回到登录页面,代码如下。 1 router.beforeEach((to, from, next) => { 2 let token = localStorage.getItem("token" ); 3 console.log(token) 4 if (token || to.path === "/" ) { 5 next(); 6 } else { 7 next({ 8 path:"/" 9 }); 10 } 11 }) 二、封装请求方法 在教务管理系统中,我们需要自己封装请求方法,以完成一些麻烦的任务,封装的代码如下。 1 import axios from "axios" 2 3 const service = axios.create({ 4 baseURL: "http://127.0.0.1:7001/" 5 }) 6 export default service 三、登录请求功能 在登录的过程中,我们需要向后台发送数据,并对后台传的数据,进行判断,以做出各种网页的效果,代码如下所示。 1 login() { 2 request({ 3 url:"/login" , 4 method:'post' , 5 data: this .dataQ 6 }).then

Java集合输出

风格不统一 提交于 2020-08-11 18:27:13
Java集合输出 实际开发中,集合输出有四种形式。Iterator,ListIterator双向迭代输出,Enumeration枚举输出,foreach输出。绝大部分都用Iterator或者foreach输出。 Iterator输出 Iterator使用方式 这输出方式是官方推荐,使用最多的遍历方式。用到两个函数, hasNext() 判断是否存在下一个元素, next() 函数,返回当前元素。具体代码如下: Set<String> set = new HashSet<String>(); set.add("hello"); set.add("world"); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next());; } Iterator remove方法 Iterator 里面有remove方法,使用时要注意(如果不是必须,就不要使用)。Collection里也有remove方法,但是在迭代中使用了Collection的remove方法会导致迭代失败。只能使用Iterator里的remove方法,此时原始数据中的数据也被删除了。 总结:迭代时使用 Collection.remove 会出现并发更新异常,只能通过

Eslint文件中忽略验证的注释写法

与世无争的帅哥 提交于 2020-08-11 18:03:56
// 1. 在整个文件中取消eslint检查: /* eslint-disable */ alert(‘foo’); // 2. 在整个文件中禁用某一项eslint规则的检查: /* eslint-disable no-alert */ alert(‘foo’); // 3. 在整个文件中禁用多项eslint规则的检查: /* eslint-disable no-alert, no-console */ alert(‘foo’); console.log(‘bar’); // 4. 针对某一行禁用eslint检查: alert(‘foo’); // eslint-disable-line // eslint-disable-next-line alert(‘foo’); // 5. 针对某一行的某一具体规则禁用eslint检查: alert(‘foo’); // eslint-disable-line no-alert // eslint-disable-next-line no-alert alert(‘foo’); // 6. 针对某一行禁用多项具体规则的检查: alert(‘foo’); // eslint-disable-line no-alert, quotes, semi // eslint-disable-next-line no-alert, quotes,

hexo笔记七:next主题添加版权声明

房东的猫 提交于 2020-08-11 17:58:01
版权声明是指在文末加上这么一段文字: 本文记录如何添加文章的版权声明 1 编辑主题配置文件: cd 博客目录 vim themes/next/_config.yml # 找到下列信息设置为true,许可协议用默认的就行了。 # Declare license on posts post_copyright: enable: true license: CC BY-NC-SA 3.0 license_url: https://creativecommons.org/licenses/by-nc-sa/3.0/ 2 编辑博客配置文件: cd 博客目录 vim _config.yml # 一定要设置url信息,否则版权声明中的文章地址信息是错误的 # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' url: http://自己的域名或者ip地址 3 重新生成博客: cd 博客目录 hexo g 然后就可以看到版权声明信息了。 当然,前提是你的文章写的好才有转载的价值,不然别人就算搞盗版抄袭也看不上你的文章,那就然并卵了。。。 来源: oschina 链接: https://my.oschina.net/u/4348489

Zotero 如何手动导入参考文献?

狂风中的少年 提交于 2020-08-11 15:58:31
本文将演示手动导入 BibTeX 格式参考文献到 Zotero 。 首先打开学术网站,例如维普期刊或中国知网等,搜索关键词。知网和万方类似。完成后如图所示 选中目标文献,点击导出题录。导出格式选择 Refworks 。如下图所示 点击复制按钮。打开 Zotero 软件,依次点击文件-从剪贴板导入。 完成导入过程。 少量文章参考文献也可以使用文件导入。本文以 生物技术通报 为例。 打开一篇 植物miRNA作用方式的分子机制研究进展 文献,如图所示 输出选择BibTeX。将文献文件下载到本地,可以选择打开文献后复制到剪贴板使用上文导入。 也可以使用文献导入向导导入。依次点击文件-导入-文件。选择文献文件。 本文下载示例文件为txt文件。推荐根据下载文件类型选择对应格式。本文举例文件类型选择txt格式。 点击打开 点击next。 点击 Finish 。完成文献导入工作。 需要指出,本文英文标题并未导入,可能还需要手动更正后才能在文章中显示。 Zotero 支持很多格式导入,常见有 BibTeX、BibLaTeX等。 详细支持信息参阅 https://www.zotero.org/support/kb/importing_standardized_formats . 来源: oschina 链接: https://my.oschina.net/u/1011130/blog/4473185

MySQL事务学习

冷暖自知 提交于 2020-08-11 15:06:44
MySQL事务: 1、事务特性:原子性,一致性,隔离性,持久性 原子性: 对一些操作,要么同时成功,要么同时失败。 一致性: 对一些操作,处理结果必须一致的,比如转账:A转给B,那么A账户减少100元,则B账户必须增加100元。 隔离性: 多个事务操作数据的表或者行,如果没有隔离机制,那么不同的事务操作相同的数据时,就会产生相互干扰,影响数据结果。 持久性: 对数据的修改或者操作,是永久的操作,比如数据库服务器发生故障等,数据也能永久保存下来。 2、事务并发的几大问题: 脏读: 一个事务读取到了其他事务未提交的修改。 不可重复读: 一个事务读取到了其他事务已提交的操作(修改或删除); 幻读: 一个事务读取到了其他事务已提交的插入操作。 丢失更新: 应用层面的问题,不是由数据库提供机制所能解决的(这里暂不讨论),比如两个用户先后对某数据进行修改,那么第一次修改的数据会被第二次修改的数据所覆盖。 事务并发的几大问题其实都是读一致性问题。必须由数据库提供一定的事务隔离机制来解决。 3、隔离性几种级别: 未提交读(Read Uncommitted): 事务未提交的数据对其他事务是可见的,会出现脏读。–未解决任何并发问题。 已提交读(Read Committed): 一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读。解决脏读问题。 可重复读(Repeatable Read)

IPv6地址学习笔记

不问归期 提交于 2020-08-11 15:00:00
1 IPv6 的优势 l 提供2的128次方地址,大约340万亿亿个地址; l 层次化路由,前3位固定,第4~16位是顶级聚合,理论上互联网骨干网路由只有8192条路由(2的13次方); l 定长报头 (40Byte) ,多达12个选项,分为基本头和扩展头; l 支持即插即用,设备接入到网络中可以自动获取网络前缀和参数,结合自身链路地址生成IP地址,简化网络管理; l 更好的安全保障,实现扩展头支持ipsec,无需借助其它安全设备进行加密; l 引入了流标签(flow lable),可以进行相同流量标记,实施QOS。 2 IPv6 地址介绍 2.1 地址表示 128 位,16位分为1块,总共8块(2 16 =65536,用16进制表示则16 4 =65536,因此每块是4位的16进制数 ) 对比ipv4,32位,8位1块(2 8 =256),分为4块 举例: 1001:0fa4:0001:2c00:0000:0000:0002:0ef1 简化规则1:每一块的起始0可以省略 1001:0fa4: 1:2c00: 0: 0: 2:0ef1 简化规则2:有1个或连续的多个0组成的地址块可以用::取代,但不能有多个 :: 1001:0fa4: 1:2c00::2:0ef1 2.2 地址结构 比较常用的是64位前缀 2.3 EUI64 电气和电子工程师协会 (IEEE)定义,将 EUI-64