Entry

Java多线程之深入解析ThreadLocal和ThreadLocalMap

和自甴很熟 提交于 2020-08-16 07:02:23
Java多线程之深入解析ThreadLocal和ThreadLocalMap ThreadLocal概述 ThreadLocal是线程变量,ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 它具有3个特性: 线程并发:在多线程并发场景下使用。 传递数据:可以通过ThreadLocal在同一线程,不同组件中传递公共变量。 线程隔离:每个线程变量都是独立的,不会相互影响。 在不使用ThreadLocal的情况下,变量不隔离,得到的结果具有随机性。 public class Demo { private String variable; public String getVariable() { return variable; } public void setVariable(String variable) { this.variable = variable; } public static void main(String[] args) { Demo demo = new Demo(); for (int i = 0; i < 5; i++) { new Thread(()->{ demo.setVariable(Thread

常见C++面试题(三)

谁都会走 提交于 2020-08-16 03:43:02
strcpy和memcpy有什么区别?strcpy是如何设计的,memcpy呢? strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。(保证dest可以容纳src。) memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。 strcpy的原型是:char* strcpy(char* dest, const char* src); char * strcpy( char * dest, const char * src) // 实现src到dest的复制 {    if ((src == NULL) || (dest == NULL)) // 判断参数src和dest的有效性   {        return NULL;   }    char *strdest = dest; // 保存目标字符串的首地址    while ((*strDest++ = *strSrc++)!= ' \0 ' ); // 把src字符串的内容复制到dest下    return strdest; } memcpy的原型是:void *memcpy( void *dest, const void *src, size_t count ); void *memcpy( void *memTo,

HashMap 相关方法的源码?

半世苍凉 提交于 2020-08-16 03:35:00
JDK8 之前 hash:计算元素 key 的散列值 ① 处理 String 类型时,调用 stringHash32 方法获取 hash 值。 ② 处理其他类型数据时,提供一个相对于 HashMap 实例唯一不变的随机值 hashSeed 作为计算初始量。 ③ 执行异或和无符号右移使 hash 值更加离散,减小哈希冲突概率。 indexFor:计算元素下标 将 hash 值和数组长度-1 进行与操作,保证结果不会超过 table 数组范围。 get:获取元素的 value 值 ① 如果 key 为 null,调用 getForNullKey 方法,如果 size 为 0 表示链表为空,返回 null。如果 size 不为 0 说明存在链表,遍历 table[0] 链表,如果找到了 key 为 null 的节点则返回其 value,否则返回 null。 ② 如果 key 为 不为 null,调用 getEntry 方法,如果 size 为 0 表示链表为空,返回 null 值。如果 size 不为 0,首先计算 key 的 hash 值,然后遍历该链表的所有节点,如果节点的 key 和 hash 值都和要查找的元素相同则返回其 Entry 节点。 ③ 如果找到了对应的 Entry 节点,调用 getValue 方法获取其 value 并返回,否则返回 null。 put:添加元素 ①

我从未见过如此精辟的解说方式,双列集合框架 Map,看一遍就够了

邮差的信 提交于 2020-08-16 03:32:33
1.常用的实现类结构 一、HashMap 实现了Map、Cloneable、Serializable接口,继承了AbstractMap类 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable /** * Map接口: 实现键值对,Map接口规定了一个key对应一个value * HashMap使用该接口用来替换Dictionary类 * * AbstractMap类: 继承Map的抽象类,减少Map操作的实现 * * Cloneable接口: 可以显示的调用Object.clone()方法,合法的对该类 * 实例进行字段复制 * * Serializable接口: 实现该接口后,该类可以被序列化和反序列化 */ 1.HashMap是否线程安全? HashMap是线程不安全的,在并发的环境下可以使用ConcurrentHashMap。 2.HashMap的内部实现 内部实现:在JDK1.8之前是数组+链表,JDK1.8之后是数组+链表+红黑树 加入红黑树的原因:JDK1.8之前HashMap使用的是数组加链表,由于哈希函数不能百分百的让元素均匀的分布,就会造成有大量的元素存入同一个index(桶)下,这样index就形成了一条很长的链表

《隐秘的角落》弹幕分析,制作词云,看看观众们对该剧的评价如何

梦想的初衷 提交于 2020-08-16 02:54:34
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 最近有部很火的悬疑推理剧:《隐秘的角落》,豆瓣评分9.0,周末闲来无事,在追剧的同时爬取了下该剧第一集的弹幕,我们通过对弹幕进行分析,制作词云,来看看观众们对该剧的评价如何。 整篇文章分为两部分:1.爬取爱奇艺中该剧第一集的弹幕 2.对爬取出来的弹幕做处理,并制作词云。 1.爬取爱奇艺弹幕 相比于其他视频网站来说,爱奇艺的弹幕难爬一些,为啥呢,因为你爬取出来的文件是乱码的(下边会贴图),需要自己再把该文件二进制编码之后才能用。具体步骤如下: 首先,打开浏览器,进入爱奇艺页面,点开该剧,弹幕打开,然后F12,浏览器下方或者右侧会弹出一些界面,选择Network,在我图上标注的框中输入“bullet”搜索弹幕相关的文件,为啥输入这个搜索呢,因为这个单词的意思就是弹幕,程序员命名东西一般也是有规律的,还有大多视频网站的弹幕相关文件都是这个名字哈哈。如果你F12搜索之后无内容,那直接点击下浏览器刷新按钮即可。下图中箭头指的分别是Network、搜索框、弹幕文件名和弹幕内容(你可以看到,弹幕内容是乱七八糟的乱码)。还有说明一点,弹幕文件一集不止一个,爱奇艺5分钟加载一个弹幕文件(为啥5分钟,下边会解释)。 接下来,观察弹幕文件出现的规律以及弹幕文件地址中的规律

02 | 数据结构学习笔记:快速的Redis有哪些慢操作?

不羁的心 提交于 2020-08-15 21:35:48
目录 一、redis为什么快? 二、这些数据结构都是值的底层实现,键和值本身之间用什么结构组织? 为什么hash表操作变慢了? redis如何解决hash冲突问题? 什么时候会发生rehash? 集合数据操作的复杂度 集合的操作效率和哪些因素相关呢? 整数数组和双向链表 压缩列表 跳表 redis操作的复杂度 三、为什么集合类型有那么多的底层结构,它们都是怎么组织数据的,都很快吗? 四、什么是简单动态字符串,和常用的字符串是一回事吗 一、redis为什么快? redis接收到一个键值对操作后,能以 微秒级别 的速度找到数据,并快速完成操作。 1、所有操作都在内存上完成,内存的访问速度本身就很快 2、归功于它的数据结构,键值对是按一定的 数据结构 来组织的,操作键值对最终就是对数据结构进行增删改查操作。 String(字符串) List(列表) Hash(哈希) Set(集合) Sorted Set(有序集合 这些是数据的保存形式的类型也就是值的类型,并不是底层的数据结构,这里需要注意。 底层数据结构一共有 6 种,分别是 简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组 List、Hash、Set 和 Sorted Set 这四种数据类型,把这四种类型称为集合类型,它们的特点是 一个键对应了一个集合的数据。 二、这些数据结构都是值的底层实现,键和值本身之间用什么结构组织?

OpenLDAP安装与配置

谁说我不能喝 提交于 2020-08-15 16:00:35
转载自: https://blog.csdn.net/dengchenrong/article/details/88389947 一、背景 因为公司项目中已经使用到ldap,但是不是我搭建的,并且ldap是部署在另一台机器上。现在需要切一个简化系统给客户去使用,并且只用一台服务器,需要使用单独的用户和数据管理,所以就开始了ldap的安装和搭建工作。 二、OpenLDAP简介 在安装OpenLDAP之前,我们首先来介绍下LDAP。 LDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,简称LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。 LDAP提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但OpenLDAP目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。 LDAP具有两个标准,分别是X.500和LDAP。OpenLDAP是基于X.500标准的,而且去除了X.500复杂的功能并且可以根据自我需求定制额外扩展功能,但与X.500也有不同之处,例如OpenLDAP支持TCP/IP协议等,目前TCP/IP是Internet上访问互联网的协议。

Linux内核启动流程-迅为IMX6ULL开发板(二)

邮差的信 提交于 2020-08-15 14:48:34
基于迅为-IMX6ULL开发板 Linux 内核启动(三):内核初始化 start_kernel是所有Linux平台进入系统内核初始化后的入口函数,它主要完成剩余的与 硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程- init 进程并等待用户进程的执行,这样整个 Linux内核便启动完毕。 30.3.1 start_kernel 函数 start_kernel 通过调用众多的子函数来完成 Linux 启动之前的一些初始化工作,由于start_kernel 函数里面调用的子函数太多,而这些子函数又很复杂,因此我们简单介绍一下一些重要的子函数。start_kernel 函数定义在文件 init/main.c中。精简并添加注释后的 start_kernel 函数内容如下: asmlinkage __visible void __init start_kernel(void) { char *command_line; char *after_dashes; lockdep_init(); /* lockdep 是死锁检测模块,此函数会初始化 * 两个 hash 表。此函数要求尽可能早的执行! */ set_task_stack_end_magic(&init_task); /* 设置任务栈结束魔术数, *用于栈溢出检测 */ smp_setup

【微服务】spring cloud config 工作原理源码分析

半世苍凉 提交于 2020-08-15 13:17:39
spring cloud config 工作原理 1. spring cloud config 测试案例 说明:为方便起见,这里使用本地文件(native)作数据后端,Spring cloud config 支持的数据后端参考:EnvironmentRepositoryConfiguration 1.0 spring cloud config server 启动类:ConfigServerApplication // 开启Spring Config Server 功能,主要为引入Server自动化配置开启服务器功能:ConfigServerAutoConfiguration // 对外开放http功能(ConfigServerMvcConfiguration):EnvironmentController、ResourceController @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } 配置服务器配置:bootstrap.yml server: port:

.NET Core Web APi大文件分片上传研究

一世执手 提交于 2020-08-15 12:52:45
前言 前两天发表利用FormData进行文件上传,然后有人问要是大文件几个G上传怎么搞,常见的不就是分片再搞下断点续传,动动手差不多也能搞出来,只不过要深入的话,考虑的东西还是很多。由于断点续传之前写个几篇,这里试试利用FormData来进行分片上传。 .NET Core Web APi文件分片上传 这里我们依然是使用FormData来上传,只不过在上传之前对文件进行分片处理,如下HTML代码 < div class ="form-horizontal" style ="margin-top:80px;" > < div class ="form-group" > < div class ="col-md-10" > < input name ="file" id ="file" type ="file" /> </ div > </ div > < div class ="form-group" > < div class ="col-md-offset-2 col-md-10" > < input type ="submit" id ="submit" value ="上传" class ="btn btn-success" /> </ div > </ div > </ div > 接下来则是上传脚本,如下: $( function () { $( '#submit')