源码

ThreadLocal源码解析

◇◆丶佛笑我妖孽 提交于 2020-01-18 05:30:27
多线程并发访问临界资源,破坏原子操作,会导致线程安全问题。将公共变量与ThreadLocal进行绑定,线程使用该公共变量时拿到的是在该线程中的副本变量,即将线程中的数据进行了隔离,多个线程能使用该变量但互不影响。 变量值的存放路径为:Thread->ThreadLocalMap->Entry->value,ThreadLocal作为Entry的key,通过key可以拿到value。 ThreadLocalMap的数据结构示意图: 1. 成员变量 内部类ThreadLocalMap 中的Entry[] table 数组(数据结构),table的长度必须是2的n次方,size表示map中entry的个数,threshold表示扩容阈值。阈值通常为2/3*length。 ThreadLocalMap中内部类Entry的value表示线程存储的副本变量值。Entry继承WeakReference,Entry的key是ThreadLocal,是弱引用,在垃圾回收时被回收。 2. 构造方法 无参构造 3. 查找元素 public T get() { //获取当前执行线程 Thread t = Thread.currentThread(); //获取当前线程的成员变量threadLocals ThreadLocalMap map = getMap(t); if (map != null) { /

Tinyhttpd源码分析——超轻量级的HTTP服务器

倾然丶 夕夏残阳落幕 提交于 2020-01-18 05:13:11
前言 T inyhttpd是一个不到500行的超轻量 级的 Http Server, 通过阅读这里面的源码,可以帮助大家理解服务器程序的本质。这个项目比较适合刚学习Linux服务器开发或刚学网络编程的人,因为整个项目所涉及到的知识并不多。这里面的知识点不多,但是有几个小知识若是要细究的话,还是可以发现很多问题的。 下载地址: http://sourceforge.net/projects/tinyhttpd/ https://github.com/EZLippi/Tinyhttpd 源码阅读顺序: main -> startup -> accept_request -> execute_cgi, 了解 主要工作流程后再仔细把每个函数看一看。 工作流程 : (1) 服务器启动,在指定端口或随机选取端口绑定httpd服务。 (2) 收到一个HTTP请求时 ( 其实就是listen的端口accpet的时候 ) , 创建 一个线程运行accept_request函数。 (3) 取出HTTP请求中的method (GET或POST)和url。对于GET方法,如果有携带参数,则 query_string指针指向url中?后面的GET参数。 (4) 格式化url到path数组,表示浏览器请求的服务器文件路径,在tinyhttpd中服务器文件是在htdocs文件夹下。当url以 / 结尾

H5录音音频可视化-实时波形频谱绘制、频率直方图

南笙酒味 提交于 2020-01-18 00:28:37
这段时间给 GitHub Recorder开源库 添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些);趁热打铁写了一个音频可视化相关扩展测试代码,下面这张就是测试Gif截图,看起来还算过得去, 测试地址 上面这些波形、频率的计算和显示都是由纯js代码编写的,并未用到浏览器专有特性,因此可以方便的移植到其他语言实现,比如移植到Android、IOS原生实现。 FrequencyHistogramView音频可视化频率直方图显示 此功能源码: frequency.histogram.view.js + lib.fft.js 12kb大小源码,音频可视化频率直方图显示;外观为上面Gif图最后一行,可通过参数配置绘制成不同的外观。 此扩展核心算法参考Java开源库 jmp123 的代码编写的, jmp123 版本 0.3 ;直方图我特意优化主要显示0-5khz语音部分,其他高频显示区域较小,不适合用来展示音乐频谱。 要获得PCM频率信息,需要将PCM由时域转换成频域,这里就用到了 FFT算法 快速傅里叶变换,里面水很深我就没有深入研究了,这里直接用的jmp123里面的FFT实现,纯js代码实现100行不到。我们只管使用就ok了,假设有 44100hz 采样率的 16位 PCM数据,取 1024个 采样数据经过FFT变换后,会输出

linux input输入子系统源码分析

安稳与你 提交于 2020-01-17 23:29:33
总体软件架构 先来个整体的软件层次架构图: 从上图输入子系统的框架图,可以看出,输入子系统由Input driver(驱动层)、Input core(输入子系统核心)、Event handler(事件处理层)三部分组成。一个输入事件,如鼠标移动、键盘按下等通过Input driver -> Input core -> Event handler -> userspace的顺序到达用户空间的应用程序。 1.系统核心层(Input core) 抽象出来的与具体硬件无关,提供一些通用功能,主要包括如下: struct input_dev *input_allocate_device(void) 具体的输入设备都被抽象出来了统一用struct input_dev来表示 int input_register_device(struct input_dev *dev) 输入设备注册 功能 接口 分配输入设备结构体 struct input_dev *input_allocate_device(void) 输入设备注册 int input_register_device(struct input_dev *dev) 报告输入事件 void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int

程序员离职带走源码竟获利800万,网友:我一般都是删库跑路

自作多情 提交于 2020-01-17 22:50:31
辞职带走自己写的源码算违法吗? 程序员一般来说都会与公司签订保密协议和所有权协议的。如果没签订的话,照法理来推论,工作期间的所有代码和项目均属于公司财产,未经允许带走是违法的,这行为可以上诉的,具体要看给公司造成的损害程度 具体要看给公司造成的损害程度。近日就有网友发帖称,某程序员在离职时将公司的源代码拷贝后带走,后又利用这些源码获利800万人民币。 随后又称自己在离职的时候,公司并没有这样的规定。然后向网友发问:你们平时离职都是必须要上交代码的吗? 然后一位百度程序员表示不理解,没交代码你咋离得职...厉害了。 所有网友也是表示肯定,离职时肯定要上交代码的。 大部分程序员都会有这样的想法,想要带走自己亲手写的代码,当然好多人都是出于学习的目的,或者说处于对自己写的代码比较留恋等,基本上不会有人有着坏的目的。 你们有过这样的想法吗?对于出现这样一件事情,大家是怎么样看待这位程序员的做法呢? 来源: CSDN 作者: 编程大本营 链接: https://blog.csdn.net/qun821871075/article/details/104025075

ReentrantReadWriteLock源码分析

喜你入骨 提交于 2020-01-17 18:23:25
概述 ReentrantReadWriteLock维护了一对相关的锁,它们分别是共享readLock和独占writeLock。关于共享读锁和排他写锁的概念其实很好理解。所谓共享读锁就是一个线程读的时候,其它线程也可以来读(共享),但是不能来写。排他写锁是指一个线程在写的时候,其它线程不能来写或读(排他)。除了这个特点之外,ReentrantReadWriteLock还有一个特点就是可重入的。它和ReentrantLock一样都是支持Condition的。而且ReentrantReadWerite还支持锁降级,即允许将写锁降级为读锁。 简单使用 最最基础的用法如下: ReentrantReadWriteLock lock=new ReentrantReadWriteLock(); public void read(){ lock.readLock().lock(); //需要加读锁的操作 lock.readLock().unlock(); } public void write(){ lock.writeLock().lock(); //需要加写锁的操作 lock.writeLock().unlock(); } ReentrantReadWriteLock无非就是这几种情况,读读共享,写写互斥,读写互斥,写读互斥。 下面我们就以这个最基础的用法,来分析一下其内部的原理 源码分析

天猫登录源码 POST C#

醉酒当歌 提交于 2020-01-17 16:13:35
HttpHelper 请从网络中搜索; public partial class LoginTMall : Form { public LoginTMall() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { string postDate = getPostString(); HttpItem itemLogin = new HttpItem() { URL = " https://login.taobao.com/member/login.jhtml ", Method = "POST", ContentType = "application/x-www-form-urlencoded", Referer = " https://www.taobao.com/ ", Postdata = postDate, Cookie = CommonDB.tmailModel.cookie, }; HttpHelper helperLogin = new HttpHelper(); HttpResult resultLogin = helperLogin.GetHtml(itemLogin); CommonDB.tmailModel.cookie =

linux centos7 非root用户安装源码版docker

放肆的年华 提交于 2020-01-17 15:43:41
注意:非root用户必须要有sudo权限 一、安装前的准备 1.查看当前主机是否有docker组 若没有输出结果则新建 再次查看,发现已经有了docker组 2.新增拥有sudo权限的用户(若知道root和 其他拥有 sudo权限的 系统用户密码,跳到3;若都没有,必做) 修改该用户的密码 为新增的用户添加sudo权限 sudo vi /etc/sudoers   在92行下一行添加   test   ALL=(ALL)   ALL 3.把当前用户加入到docker组 (此时用户并没有加入进docker组) 切换至sudo权限用户,然后再切换回当前用户( 此时可以看到用户已经加入docker组 ) 3.删除新增的用户和它的sudo权限(第2步没做请忽略此步) sudo vi /etc/sudoers   在92行下一行添加   test  ALL=(ALL) ALL 两次退出,不然删除用户时会报错 二、安装docker 1.下载docker源码包并上传至虚拟机 https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-18.09.0.tgz 2.解压源码包至指定目录下 3.将解压出来的docker目录下的指令复制到 /usr/bin/ 目录下 sudo cp docker/*

【Canal源码分析】TableMetaTSDB

孤街浪徒 提交于 2020-01-17 13:09:03
这是Canal在新版本引入的一个内容,主要是为了解决由于历史的DDL导致表结构与现有表结构不一致,导致的同步失败的问题。采用的是Druid和Fastsql,来记录表结构到DB中,如果需要进行回滚时,得从DB中根据时间点去查到对应的库表结构,然后进行业务的处理。也就是,如果我们想要这样的效果,需要开启TSDB的功能,同时要新增库表来记录表结构的变更。 这个基本上是在parser启动时,寻找位点时需要的。当然在系统启动的时候,会将库表的信息写入到DB中,然后定时24小时写入一次。另外就是在发生了DDL时,会更新表结构。 我们来看下他的类图。 一张表记录的是表结构,加上了时间,另一张记录的是当时的DDL语句。在进行回溯的时候,直接根据时间戳和binlog文件名来进行寻找即可找到。当然这些数据也会在内存中保存一份,加快速度。 具体的介绍可以见这个链接https://github.com/alibaba/canal/wiki/TableMetaTSDB。 来源: https://www.cnblogs.com/f-zhao/p/9116316.html