编程
liangdu_Zuker
这个作者很懒,什么都没留下…
展开
-
如何解决if语句太多
如何解决if语句太多【用策略模式】定一个策略基类,然后针对每个if实现一个策略子类,然后利用传入进来的参数,去匹配采用的策略,有点类似分治思想。【用哨兵伪节点】我们一般习惯用if去判断边界问题,对于非边界的问题不需要用if,那么我只需要给当前边界问题加上前继和后继的哨兵伪节点,就可以做到不需要用if语句了。【用驱动表模式】,创建一个actionmap,key就是我们的条件case, value就是针对这个case所对应的处理函数handle. 这样也可以避免写很多if 。【使用责任链原创 2021-07-16 10:26:10 · 3800 阅读 · 0 评论 -
线程池实践经验总结
线程池的使用技巧线程池常用的两种场景:【分治】可以将任务利用分治的思想分割成多个任务,然后再利用线程池控制CPU并发的线程数量。【限制任务执行时间】线程池的超时机制的妙用,可以利用Future超时机制,帮我们实现超时的功能。什么是callable,什么是runnable,什么是ForkJoin,什么是Future,什么是FutureTaskcallable是一个接口,它允许我们传递返回值给线程执行的上下文。通俗的说,就是给了我们一个读取线程的结果。这个结果通过Future进行封装,Futur原创 2020-10-16 11:13:27 · 215 阅读 · 0 评论 -
【翻文+导读】《Writing a C Compiler》从0开始写C编译器
【翻文+导读】《Writing a C Compiler》从0开始写C编译器前言据说,这是学习做编译器必读优秀文章,所以就做一下翻译以及导读,顺便自己也学习一下。作者Nora Sandler 也很用心,涉及一些如何从0开发编译器的实施计划和方法论 (Abdulaziz Ghuloum 的 增量开发的方式)。转载请留言申请即可翻译《Writing a C Compiler, Part 1》https://norasandler.com/2017/11/29/Write-a-Compiler.html原创 2020-09-15 17:27:44 · 2650 阅读 · 0 评论 -
【编译器学习】编译器冷知识
冷知识:gcc是一个编译器套件,他包含了各色的前端编译器,以及中间端编器后端编译器。我们常常说的编译器会将源码编程.s结尾的汇编码然后再经由汇编器编程,o结尾的二进制码,.a结尾的也是二进制码,他是静态链接库,他会被链接到程序中,形成完整的可执行文件EXE。(可以理解为是打包的过程).so结尾的也是二进制码,他是动态链接库,他可以程序运行后加入内存,进行共享引用。gcc可以将各色语言编写的源码翻译成.o目标文件,并最终组成可执行文件。其中包括 将 C++,Java,Fortra原创 2020-09-09 21:04:20 · 153 阅读 · 0 评论 -
【编译器学习】EBNF扩展巴科斯范式学习总结
EBNF扩展巴科斯范式学习总结是一种描述计算机编程语言且与上下文无关(没有前置条件)的语法的一种语法表达式。简而言之,就是描述语言语法的规范。EBNF的基本语法形式如下:左手边(LeftHandSide) = 右手边(RightHandSide).左手边叫非终端符号,也就说他还可以被其他表达式引用右手边是非终端的组成。了解一个概念[终端符号与非终端符号], 终端符号就是可以认为是原子符号,或者认为是常量池量的常量,他是用来描述语法的最小粒子概念, 终端可以分为用户自定义的原创 2020-09-09 20:44:42 · 1229 阅读 · 0 评论 -
编译器概念入门
编译器概念入门找网上关于编译器的教学方法,多数会找一个语言作为例子比如[Rust]我可以了解为什么选择Rust以及Rust相关的百科介绍其次就是按照教程的思路了解编译器知识点的大概,在此之前我们可以分为两部分:编译器相关概念,编译器相关算法,编译器的需求和实现知识。按照:是什么,怎样样,有什么 的认知过程学习编译器。编译器是做什么的?编译器获取源代码,产生一个二进制文件。我们将要学习的是比较狭义的编译器,所以会有很多计算机相关的知识概念。编译器的核心行为:将源码的单词和符原创 2020-09-08 21:21:37 · 725 阅读 · 0 评论 -
防御性编程的两种手段之一篡改用户输入
非防御性编程:不做边界判断,不假设用户输入会出现极端情况。说白一点就是写代码没有考虑边界。防御性编程:考虑代码有极端情况,以及有边界存在。防御性有两种手段:1.一个是利用if语句将外部用户输入进行检查,或者实时对用户变量进行检查,确保任何参与外部数据计算的过程变量都是合法的。这种做法就是会产生很多if。2.另一种手段,就是修改输入,使其不再可能出现异常情况,常见的做法就是拷贝用户输入,然后...原创 2020-04-20 19:58:23 · 257 阅读 · 0 评论 -
从什么是althashing开始解读java的HashMap
从什么是althashing开始解读java的HashMap本文不包含一行代码,你可以读完,回头再去看代码,或者你一边看着源码,一边品味也可以。建议看完再重看一边源代码。写在前面本文的目的是搞懂Map的设计思想,HashMap的实现原理。capacity, thresholder, loadFactor究竟是什么奇淫巧计。所谓的rehash,是业界在扯淡还是真有其事?被众...原创 2020-03-26 21:16:02 · 311 阅读 · 0 评论 -
Spring异常处理框架
Spring异常处理框架初识底层接口类HandlerExceptionResolverHandlerExceptionResolver 是一个处理 Web 程序发生异常时的接口,当异常发生时,需要进行捕获并返回一个友好的ModelAndView给请求用户,可以通过继承AbstractHandlerExceptionResolver来实现。这个接口返回 null 表示让其他异常处理器进行处理,...原创 2019-12-26 11:26:40 · 557 阅读 · 0 评论 -
Java异常最佳实践笔记
Java异常最佳实践笔记引用《如何善用Java异常》https://juejin.im/post/5bacd8975188255c69780e7b笔记Java中的异常分为两种:无法捕获处理的系统级别Error.可以被认为处理的检测异常Exception.重点是他们都继承了Throwable接口其中需要我们处理的只有Exception的子类。Exception的子类...原创 2019-12-26 11:24:39 · 282 阅读 · 0 评论 -
git分支管理规范
git分支管理规范公司团队特点:以下特点是有部分是假设性,部分是实际的:一个功能的开发大概在1到3人,或者4到5人之间。大部分人对git的熟练程度不高,缺少Git分支管理知识培训或者不希望在Git分支管理上花费太多时间培训。弱化Git分支管理标准的作用,以灵活应对各种需求。(减少规范而引发纷争从而影响开发进度,毕竟Git是很强大的工具,依赖工具,而不依赖文字约定)需要提供几种场景的G...原创 2019-10-18 21:00:27 · 166 阅读 · 0 评论 -
ESP8266+Arduino实现TCP远程命令控制方案
用“SmartConfig技术”控制Esp8266模块连接 路由器的无线网络。在Arduino通过串口设置ESP8266位服务器模式,并且绑定TCP service端口。然后 手机等设备通过Tcp协议连接Esp8266模块并发送TCP消息给ESP8266。arduino通过ESP8266的串口函数获取TCP消息,并处理相关业务(比如,通过io口控制led等开关)原创 2017-08-24 14:15:31 · 5637 阅读 · 1 评论 -
【学习JVM】JAVA并发工具
JVM并发同步机制需要参考的准备数据:《深入理解JAVA虚拟机》《java并发编程的艺术》需要参考的知识点:JVM并发同步机制重要笔记:Reentrantlock基于AQS实现。AQS基于Volatile与CAS实现,在unlock修改volatile变量时不存在多线程访问(unlock在临界区内),所以不需要CAS指令。CAS的底层通过操作系统的cmpxchg指令实现...原创 2019-02-13 16:51:44 · 259 阅读 · 0 评论 -
How many fix bug method do you have?
寻找错误信息寻找错误日志 和 异常信息,然后运用你的直觉和经验、智慧,推断错误原因,直捣黄龙。分析错误利用工具获取更多错误信息,综合分析,比如遇到了OOM错误的时候。调试代码开启IDE的debug模式,断电,单步调试。* 搜索网上类似的错误*复制关键异常信息上谷歌搜索(这个很讲究技巧)。阅读文档认住版本号!认住版本号!认住版本号!查看该版本的代码文档(看英文文档!看英文文档!看英文原创 2017-11-16 09:51:32 · 250 阅读 · 0 评论 -
聊聊3种内存溢出OOM(OutOfMemory)
内存溢出有2种,我们最熟悉的就是堆内存溢出异常,比如我们new一个对象或者数组,如果超出了JVM的heap内存最大限制就会爆出异常比如:从这句话我们可以知道,栈内存溢出有2种异常一种是:StackOverflowError、另一种是OutOfMemoryErrorStackOverflowError是指【线程】的栈内存原创 2017-09-19 10:17:49 · 1512 阅读 · 0 评论 -
(不用unix2doc)解决cygwin的输出重定向文件时遇到系统区分不了换行
在cygwin中cat “hello” >demo.txt你系统得到一个demo.txt文件,然后事实并不会你想的那样,你可以ls -al 返回:.... 'demo.txt'$'\r'你得到的不是【demo.txt】而是【demo.txt$\r】why?因为unix系列的系统换行符是\n而win系列的换行是\r所以入坑了。正规渠道就是原创 2017-11-02 11:23:40 · 628 阅读 · 0 评论 -
具备C语言的能力下,快速学会使用AWK为了做些什么
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。输入awk的文本首先会被按“行”划分为很多条"记录",每一行表示一条记录,每一行再由分隔符划分成很多个“域”,分隔符默认是空格符,也可以通过命令参数-F来指定比如 awk原创 2017-10-21 12:54:23 · 660 阅读 · 0 评论 -
P2P内网服务器的伪代码解释
int fd_socket; int fd_connect; int fd_server; struct sockaddr_in serv_addr; struct sockaddr_in client_addr;//创建可重复使用socket fd_socket= socket(AF_INET, S原创 2017-10-20 09:58:59 · 567 阅读 · 0 评论 -
白话RSA算法原理
密码学研究的是加密和解密。 - 加密就是把明文通过“加密算法”变成密文。 - 解密就是把密文通过“解密算法” 变成明文。加密算法,我们可以认为就是在涉及一个算法,使得 明文变成别人看不懂的符号,同时自己有办法看得懂的算法。(从严格上来讲,只要只需要把明文变成别人看不到的符号就可以了,但这样没任何意义。)解密,则是运用各种手段把别人的密文转变为明文。解密有很多种手段,尽管我要讲的是“R原创 2017-04-20 11:13:32 · 1377 阅读 · 0 评论 -
【学习JVM】JVM并发同步机制
JVM并发同步机制需要参考的准备数据:《深入理解JAVA虚拟机》需要参考的知识点:volatile原理unsafe.compareandswap原理多线程amdahl定律(在Cpu个数很大的情况下,可并行解决的子问题越多阿姆达尔值越大)final可见性原理amdahl = (Ws + Wp)/(Ws + Wp/n)知识的记录方式: - 查看博客,把没有遇见过的或者觉...原创 2019-02-13 16:52:17 · 331 阅读 · 0 评论 -
Oracle官方文档笔记《Getting Started with the G1 Garbage Collector》
Oracle官方文档笔记《Getting Started with the G1 Garbage Collector》参考资料【Oracle官方文档】https://www.oracle.com/technetwork/tutorials/tutorials-1876574.htmlhttps://docs.oracle.com/javase/8/docs/technotes/guides...原创 2019-02-13 16:53:04 · 810 阅读 · 0 评论 -
读ByteBuf有感
由于JAVA NIO的ByteBuffer类存在三个严重的缺点:- 1。只有一个缓存游标用于复杂的缓存读写操作- 2。缓存的大小固定,没有动态扩展功能,为了不出现缓存溢出异常,需要用户在对缓存进行写操作的时候进行麻烦的可写空间的检测。- 3。没有封装缓存类常用的的方法。(连用于通讯IO常用的方法都没有)因此ByteBuf对ByteBuf对原生的NIO ByteBuffer进行了扩展,弥补了原生原创 2016-10-29 19:35:21 · 1765 阅读 · 0 评论 -
InheritableThreadLocal与阿里的TransmittableThreadLocal设计思路解析
前言参考文章:《全链路跟踪(压测)必备基础组件之线程上下文“三剑客”》-- 原创: 丁威 中间件兴趣圈https://mp.weixin.qq.com/s/a6IGrOtn1mi0r05355L5Ng《阿里巴巴Transmittable ThreadLocal(TTL) github》https://github.com/alibaba/transmittable-thread-loc...原创 2019-08-15 17:48:48 · 8053 阅读 · 3 评论 -
spring事务传播级别
spring事务传播级别required经常错的,需要原子性的,如果上下文没有事务就不理会了,只顾着自己,是最简单的的事务,如字面意思。如果上下文有事务就共享一个事务,可以采用Required。默认的。supported不经常错的,同时不需要事务的可以使用supported。(少有的场景,建议采用not_supported代替,就是挂起上下文,以免影响性能。)mandatory希望原子性,...原创 2019-03-02 19:40:21 · 831 阅读 · 0 评论 -
《GO语言实战》语言学习笔记
《GO语言实战》语言学习笔记go语言编写的包易于分享,代码复用,多核利用,并发模型,编译器,类型,并发,通道,测试。内置并发机制快速的编译构建自带垃圾回收简单的语法和类型go语言只会关心直接依赖的库(什么是关心哈?)go没有类型安全保护机制,需要用go vet测试来确保不会出现类型错误goroutine协程比线程占用更少的内存协程使用一个内置数据结构channel进行同步通信,...原创 2019-03-02 19:38:36 · 299 阅读 · 0 评论 -
【学习JVM】内存屏障(Memory Barrier )
内存屏障(Memory Barrier )上面讲到了,通过内存屏障可以禁止特定类型处理器的重排序,从而让程序按我们预想的流程去执行。内存屏障,又称内存栅栏,是一个CPU指令,基本上它是一条这样的指令:保证特定操作的执行顺序。影响某些数据(或则是某条指令的执行结果)的内存可见性。编译器和CPU能够重排序指令,保证最终相同的结果,尝试优化性能。插入一条Memory Barrier会告诉编译...原创 2019-02-14 14:32:09 · 729 阅读 · 0 评论 -
volatile的指令重排细节
volatile禁止重排优化volatile关键字另一个作用就是禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象,关于指令重排优化前面已详细分析过,这里主要简单说明一下volatile是如何实现禁止指令重排优化的。先了解一个概念,内存屏障(Memory Barrier)。内存屏障,又称内存栅栏,是一个CPU指令,它的作用有两个,一是保证特定操作的执行顺序,二是保证某些变量的内存可见...转载 2019-02-14 14:31:47 · 1845 阅读 · 1 评论 -
【学习JVM】happens-before规则
happens-before规则程序顺序原则,即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。锁规则 解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是说,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就...原创 2019-02-14 14:31:01 · 318 阅读 · 0 评论 -
【学习JVM】强引用,弱引用,软引用,虚引用
强引用,弱引用,软引用,虚引用需要参考的准备数据:《深入理解JAVA虚拟机》需要参考的知识点:GC Roots引用计数器引用的定义对象的引用finalize执行时机知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 - 知识盲区标记 - JAVA内存模型这个知识点基本上每本书都会讲解,最好的...原创 2019-02-13 16:54:52 · 352 阅读 · 0 评论 -
对JAVA强引用、软引用、弱引用、虚引用的理解
强引用:有引用不清除软引用:这货是坑爹的,耦合了JVM内存机制,在JVM内存充足的情况下跟强引用一样弱引用:这家伙比较懦弱,如果该对象只剩下弱引用,他就会被清除,应用场景没听过,大冷门。虚引用:感觉这货就是设计来做缓存用的,因为他需要配合容器使用,只要容器被内存回收,他就必须要被回收。如果你用强引用做缓存的话,你回收容器的时候要先释放强引用,否则会内存泄漏。参考:htt原创 2017-08-25 17:29:08 · 227 阅读 · 0 评论 -
JS对象比较函数,引发angular的ng-option异常
angular的ng-option异常原创 2017-08-25 12:06:09 · 450 阅读 · 0 评论 -
apache.common.dbutils的BeanHandler的“缺陷”?
先看一下BUG信息:异常: 16:46:57.472 ERROR - DbUtilsExecutor-find:Cannot create com.keydak.gateguard.database.bean.gategd.GateController: com.keydak.gateguard.database.bean.gategd.GateController Query: SELE原创 2016-11-17 09:38:36 · 1397 阅读 · 0 评论 -
陷阱:设计同步锁的时候不能依赖于jvm内存分配相关
今天群里有人发了这段代码说会死锁,于是引发了一场高效的争辩。代码如下乍一看,怎么可能同步,每建立一个线程都new了一个对象,这样每个线程获得的同步锁应该!!都是不一样的。但是看到了一句神奇的代码,引起了我的注意那就是Integer想起了java对integer和String的特殊待遇Integer的存储Integer是int的原创 2016-11-29 18:07:57 · 307 阅读 · 0 评论 -
Jersey(servlet)的线程安全
#Jersey的控制器是单例的,因此需要保证多个请求到来时出现多线程并发访问Controller.处理并发的方法: - 1.类的访问域的所有成员都采用不可变的(只读)。 - 2.对可变的成员加锁(保证被访问的成员线程安全)。 - 3.采用无状态。 对于控制层我们采用第二种方案。(第一种,我们很难保证服务层的成员只读,因为他是业务逻辑层第三种,也可行,只是说原创 2016-11-16 11:21:35 · 1775 阅读 · 0 评论 -
java类方法对传入的参数的内存分配
在主线程新建对象,然后作为参数传入类方法,然后方法修改传入的值。内存检测方法jmap -histo PID实验结果:创建对象 Integer t = 1; 传入方法前Integer个数:259,传入方法后Integer个数:259,传入前后不改变 结论:做了内存引用拷贝和值拷贝,实体分配到栈空间了。创建对象 Integer t = new Int原创 2016-11-16 11:20:19 · 968 阅读 · 0 评论 -
JVM常用优化工具
一、 JVM工具 21. jps:虚拟机进程状况工具 22. jstat:虚拟机统计信息监视工具 23. jinfo:java配置信息工具 34. jhat:虚拟机堆转储快照分析工具 35. jmap:内存映像工具 36. jstack:java堆栈跟踪工具 37. VisualV原创 2016-10-29 19:42:42 · 2260 阅读 · 2 评论 -
redis学习
redis官网redis的优点:数据类型 有string(字符串)、以及4中数据结构 list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)高性能的key-value数据库对资源操作只有一个线程,从根源保证了数据的原子性周期性的把更新的数据写入磁盘把修改操作写入追加的记录文件根据记录日志实现主从同步单层树复制从服务器采用消息/订阅机制冗余原创 2016-10-29 19:39:32 · 312 阅读 · 0 评论 -
使用DAO时发生空指针错误
2014-10-6 17:38:26 dao.daoImpl.CustomerDAO save严重: save failedjava.lang.NullPointerExceptionat dao.daoImpl.CustomerDAO.save(CustomerDAO.java:51)at test.CustomerDAOtest.testSave(CustomerDAOtest原创 2014-10-06 17:44:32 · 2507 阅读 · 0 评论 -
对接口的深刻理解
[main] DEBUG org.springframework.context.support.FileSystemXmlApplicationContext - Publishing event in org.springframework.context.support.FileSystemXmlApplicationContext@35960f05: org.springframework原创 2014-10-07 01:32:39 · 646 阅读 · 0 评论 -
《Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)》读后感
读完了这篇博客,已经到了晚上11点了,在睡觉前做一下笔记。1. cocos2d-x 的自动释放池(AutoReleasePool)是克隆IOS SDK的NSAutoreleasePool的,所以如果有坐过苹果开发的应该很熟悉这是什么东西。2.他们有两点比较重要的不同: 第一点,cocos2d-x的AutoReleasePool是单例模式 ,开发者不原创 2015-03-13 22:59:27 · 772 阅读 · 0 评论