编程
赱乂
士不可以不弘毅,任重而道远
展开
-
服务端思维
推荐一个很有价值的周报文章:服务端思维值得从最早的周报开始看起,总会有问题能让你收获满满!原创 2019-06-21 17:46:17 · 229 阅读 · 0 评论 -
使用Lock来实现信号量Semaphore
@ThreadSafepublic class SemaphoreOnLock { private final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: permitsAvailable (permits > 0) private final Condition permitsAvailable...原创 2018-06-18 14:07:17 · 299 阅读 · 0 评论 -
使用显示条件变量Lock.Condition实现的有界缓存
1、wait,notify,notifyAll 同一个对象Object o,线程A调用wait方法在o的阻塞队列上进行等待a条件满足的notify通知,线程B调用wait方法在o的阻塞队列上进行等待b条件满足的notify通知。 对象o上的阻塞队列中等待的任务不是同一种类型,导致为了避免通知信号丢失,而使用notifyAll进行通知,也就是说A或者B中的某一个满足条件时,要使用notify...原创 2018-06-18 11:03:59 · 188 阅读 · 0 评论 -
何必言精通——十年杂感 兼谈其它
转自:何必言精通——十年杂感 兼谈其它30虚岁了。这一、两年,有事没事之中口中经常念着李商隐那首《锦瑟》:锦瑟无端五十弦,一弦一柱思华年。庄生晓梦迷蝴蝶;望帝春心托杜鹃。沧海月明珠有泪;蓝田日暖玉生烟。此情可待成追忆,只是当时已惘然。此情可待成追忆,只是当 时已惘然。回首过去的十年,堪称快意,十年里,领略了很多领域:新材料、写作、技术管理、企业分析、软件开发等等,都留下了不深不浅的脚印...转载 2018-06-17 21:55:48 · 204 阅读 · 0 评论 -
有界缓存的状态依赖优化
可阻塞的状态依赖操作的结构加锁模式不同寻常,因为锁是在操作的执行过程中被释放与重新获取的。构成前提条件的状态变量必须由对象的锁来保护,从而使它们在测试前提条件的同时保持不变。如果前提条件尚未满足,就必须释放锁,以便其他线程可以修改对象的转改,否则,前提条件就永远无法变成真。在再次测试前提条件之前,必须重新获得锁。acquire lock on object statewhile(pr...原创 2018-06-17 21:29:58 · 194 阅读 · 0 评论 -
使用ReentrantReadWriteLock读写锁来包装Map
当锁的持有时间较长并且大部分操作都不会修改被守护的资源时,那么读写锁能提高并发性。在ReadWriteMap中使用了ReentrantReadWriteLock来包装Map,从而使它能在多个读线程之间被安全的共享,并且仍然能避免“读写”或“写写”冲突。在现实中,ConcurrentHashMap的性能已经很好了,因此如果只需要 一个并发的基于散列的映射,那么就可以使用ConcurrentHa...原创 2018-06-17 18:03:45 · 450 阅读 · 0 评论 -
在synchronized和ReentrantLock之间进行选择
在一些内置锁无法满足需求的情况下,ReentrantLock可以作为一种高级工具。当需要一些高级功能时才应该使用ReentrantLock,这些功能包括:可定时的、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁。否则,还是应该优先使用synchronized。与ReentrantLock相比,内置锁的一个优点是:在线程转储中能给出在哪些调用帧中获得了哪些锁,并能够检测...原创 2018-06-17 16:33:56 · 590 阅读 · 0 评论 -
基于信号量的有界缓存
1、使用信号量Semaphore来实现有界缓存2、代码如下:/** * BoundedBuffer * <p/> * Bounded buffer using \Semaphore * * @author Brian Goetz and Tim Peierls */@ThreadSafepublic class SemaphoreBoundedBuffer <E&...原创 2018-06-16 21:04:54 · 286 阅读 · 0 评论 -
CyclicBarrier栅栏
1、CyclicBarrier类似于闭锁CountDownLatch,能阻塞一组线程直到某个事件发生。闭锁是一次性对象,一旦进入终止状态,就不能被重置;栅栏到某个事件发生之后,栅栏打开,栅栏将被重置,可以下次使用。闭锁的条件时等事件发生,一般为外部条件,栅栏用于等待其他线程,条件为业务线程自己控制。2、栅栏在迭代算法中非常有用:通常将一个问题拆分成一系列相互独立的子问题。3、当线程到达栅栏位置时将...原创 2018-06-09 13:32:09 · 202 阅读 · 0 评论 -
关于信号量Semaphore的acquire与release的说明
1、Semaphore信号量作为一种流控手段,可以对特定资源的允许同时访问的操作数量进行控制,例如池化技术(连接池)中的并发数,有界阻塞容器的容量等。2、Semaphore中包含初始化时固定个数的许可,在进行操作的时候,需要先acquire获取到许可,才可以继续执行任务,如果获取失败,则进入阻塞;处理完成之后需要release释放许可。3、acquire与release之间的关系:在实现中不包含真...原创 2018-06-09 11:40:21 · 21008 阅读 · 0 评论 -
Maven仓库配置阿里云私服地址
Maven默认私服地址在国外,jar下载速度比较慢,切换到国内的阿里云私服之后,jar下载速度非常快。配置步骤如下:1、找到Maven安装目录下conf文件夹下的setting.xml文件2、打开setting.xml,找到<mirrors></mirrors>标签3、在标签中增加如下代码:<mirror> <id>nexus-a...原创 2018-06-09 08:56:52 · 7584 阅读 · 0 评论 -
AbstractQueuedSynchronizer
AQS中获取操作和释放操作的标准形式:boolean acquire() throws InterruptedException{ while(当前状态不允许获取操作){ if(需要阻塞获取请求){ 如果当前线程不在队列中,则将其插入队列 阻塞当前线程 } else ...原创 2018-06-19 08:05:03 · 132 阅读 · 0 评论 -
锁Lock与原子变量Atomic的性能比较
生成随机数的方法:public class PseudoRandom { int calculateNext(int prev) { prev ^= prev &lt;&lt; 6; prev ^= prev &gt;&gt;&gt; 21; prev ^= (prev &lt;&lt; 7); return prev;原创 2018-06-19 08:05:33 · 3276 阅读 · 0 评论 -
比较并交换CAS
CAS包含了3个操作数—需要读写的内存位置V、进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。CAS的含义是:“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际是多少。”@ThreadSafepublic class Simul...原创 2018-06-19 08:05:24 · 1022 阅读 · 0 评论 -
[转]JavaScript模板引擎原理与用法
原文链接:JavaScript模板引擎原理与用法原创 2019-03-22 14:16:54 · 139 阅读 · 0 评论 -
上线代码规范
原则:上线代码必须是经过测试的代码;1、、任何改动,细微的配置及代码改动,都需要测试验证;一些修改不涉及业务相关的,可以不用测试人员介入,但是必须自测;2、如果有修改的地方,而测试没有验证的,需要放在下次,在测试验证完之后再上,保证本次上线代码为已测试代码;3、问题一般出现在大意的细节地方,魔鬼在细节;...原创 2018-12-27 20:09:06 · 416 阅读 · 0 评论 -
设计模式之禅(第2版)PDF资源分享
链接: https://pan.baidu.com/s/1gQflToJ5X2IZk09Nceyybw 提取码: du6p原创 2018-12-21 22:06:09 · 14401 阅读 · 26 评论 -
MyBatis源码本地安装编译及使用笔记
打开GitHub,搜索MyBatis 链接搜素结果如下图: MyBatis源码有两种,mybatis/mybatis-3为无注释的mybatis源码;tuguangquan/mybatis为大牛增加过中文注释的源码。自己选择想要的版本,下载zip包到本地放入开发工具,作为maven项目导入或者打开。 下载如下图: 使用maven工具进行本地项目的编译构建,clean and in...原创 2018-08-02 08:46:35 · 3074 阅读 · 0 评论 -
Jvm参数说明,栈上分配代码实现,堆溢出、栈溢出代码实现
JVM参数 运行时数据区 参数名 含义 注释 程序计数器 本地方法栈 Java虚拟机栈 -Xss 设置虚拟机栈大小 堆 -Xms 堆的最小值 堆 -Xmx 堆的最大值 堆 -Xmn 新生代的大小 堆 -XX:NewSi...原创 2018-08-03 21:48:36 · 499 阅读 · 0 评论 -
Java工程师修炼之道
转自:Java工程师修炼之道一、软件开发的核心原则此处所说的是软件开发应该遵循的一些核心原则:1、Don’t Repeat Yourself: 这是软件开发的一个基础原则,即不要做重复性劳动。也是现在所说的“极客文化”的一种。代码重复、工作重复在软件开发中都是不合理的存在。利用各种手段消除这些重复是软件开发的一个核心工作准则。2、Keep it simple stupid:即KIS...转载 2018-06-20 08:56:18 · 1519 阅读 · 0 评论 -
架构师升级步骤和平时的工作内容!
转自:架构师升级步骤和平时的工作内容! 作者:hsm_computer 简介:《Java Web轻量级开发面试教程》作者 来源:https://www.cnblogs.com/JavaArchitect之前有网友说想看架构师升级的文章,所以写了本文。先给本文中架构师做个定义:第一,能力上达到(似乎是废话),第二,公司肯承认,不仅能给架构师的头衔,更能按架构师的标准发工资。...转载 2018-06-20 08:46:00 · 356 阅读 · 0 评论 -
开发中我们需要遵循的几个设计原则!
转自:开发中我们需要遵循的几个设计原则! 作者:pengdai 出处:https://www.cnblogs.com/pengdai一、开发原则S:单一职责SRPO:开放封闭原则OCPL:里氏替换原则LSPI:接口隔离法则D:依赖倒置原则DIP合成/聚合复用原则迪米特法则在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发...转载 2018-06-20 08:28:32 · 244 阅读 · 0 评论 -
ConcurrentLinkedQueue中非阻塞链表的插入
在许多队列算法中,空队列通常都包含一个“哨兵(Sentinel)”或者“哑(Dummy)节点”,并且头结点和尾节点在初始化时都指向该哨兵节点。尾节点通常要么指向哨兵节点(如果队列为空),即队列的最后一个元素,要么(当有操作正在执行更新时)指向倒数第二个元素。使用哨兵节点与不使用哨兵节点的区别: 带哨兵节点的链表,需要额外的一个节点,插入或删除时,不论操作的位置,表头都不变,不需要额外的判...原创 2018-06-19 08:57:24 · 250 阅读 · 0 评论 -
Java-Interview
一篇不错的总结https://github.com/crossoverJie/Java-InterviewJava 知识点,继续完善中。多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。...原创 2018-06-08 14:41:19 · 1450 阅读 · 0 评论 -
MySQL查询表中重复字段的记录
根据字段分组之后条件判断个数大于1SQL:SELECT u.id,u.id_card,u.mobile_number FROM `user` u GROUP BY u.id_card HAVING COUNT(*) > 1;原创 2018-06-15 12:45:40 · 197 阅读 · 0 评论 -
关于多字段的联合索引在查询单个字段时是否可以用到索引
1、联合索引是由多个字段组成的索引。2、查询时使用联合索引的一个字段,如果这个字段在联合索引中所有字段的第一个,那就会用到索引,否则就无法使用到索引。3、联合索引IDX(字段A,字段B,字段C,字段D),当仅使用字段A查询时,索引IDX就会使用到;如果仅使用字段B或字段C或字段D查询,则索引IDX都不会用到。 这个规则在oracle和mysql数据库中均成立。如果你经常要用到多个字段的多条件查询...原创 2018-06-08 11:32:02 · 22009 阅读 · 4 评论 -
程序员你为什么这么累?配置规范
工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,结合强大的spring,效果很不错。#需求如我们现在有一个这样的配置需求,顶层是Server,有port和shutdown2个属性,包含一个service集合,service对象有name一个属性,并包含一个connector集合,connector对象有port和protocol2个属性。我一上来...转载 2018-05-23 06:52:13 · 524 阅读 · 0 评论 -
程序员你为什么这么累?函数编写建议
TIP傻瓜都能写出计算机可以读懂的代码,只有优秀的程序员才能写出人能读懂的代码!在我看来,编写简单的函数是一件简单又困难的事情。简单是因为这没有什么技术难点,困难是因为这是一种思维习惯,很难养成,不写个几年代码,很难写出像样的代码。大部分的程序员写的都是CRUD、一些业务逻辑的代码,谁实现不了?对于我来说,如果业务逻辑的代码评审,需要人来讲每一个代码做了什么,这样的代码就是不合格的,合格的代码写出...转载 2018-05-23 06:52:03 · 594 阅读 · 0 评论 -
程序员你为什么这么累?工具类编写
一个项目不可能没有工具类,工具类的初衷是良好的,代码重用,但到了后面工具类越来越乱,有些项目工具类有几十个,看的眼花缭乱,还有不少重复。如何编写出好的工具类,我有几点建议:#隐藏实现就是要定义自己的工具类,尽量不要在业务代码里面直接调用第三方的工具类。这也是解耦的一种体现。如果我们不定义自己的工具类而是直接使用第三方的工具类有2个不好的地方:不同的人会使用不同的第三方工具库,会比较乱。将来万一要修...转载 2018-05-23 06:51:51 · 3491 阅读 · 4 评论 -
程序员你为什么这么累?参数校验和国际化
今天我们说说参数校验和国际化,这些代码没有什么技术含量,却大量充斥在业务代码上,很可能业务代码只有几行,参数校验代码却有十几行,非常影响代码阅读,所以很有必要把这块的代码量减下去。今天的目的主要是把之前例子里面的和业务无关的国际化参数隐藏掉,以及如何封装好校验函数。#修改前代码controller代码/** * !!!错误范例 * * 根据id删除对象 * * @param id ...转载 2018-05-23 06:51:37 · 285 阅读 · 0 评论 -
程序员你为什么这么累?异常处理
对于大型IT系统,最怕的事情第一是系统出现了异常我不知道,等问题闹大了用户投诉了才知道出问题了。第二就是出了问题之后无法找到出错原因。针对这2个问题,说说我们项目组是怎么样规定异常处理的。再次声明我的观点,我这系列贴里面,没有什么技术点,都是一些编程的经验之谈,而且是建立在项目背景是大部分代码都是简单的CRUD、开发人员流动大水平一般的情况下。希望读者的重点不要再关注技术点。大部分工作中不需要什么...转载 2018-05-22 13:15:10 · 350 阅读 · 0 评论 -
程序员你为什么这么累?日志打印
开发中日志这个问题,每个公司都强调,也制定了一大堆规范,但根据实际情况看,效果不是很明显,主要是这个东西不好测试和考核,没有日志功能一样跑啊。但编程活久见,开发久了,总会遇到“这个问题生产环境上能重现,但是没有日志,业务很复杂,不知道哪一步出错了?” 这个时候,怎么办? 还能怎么办,发个版本,就是把所有地方加上日志,没有任何新功能,然后在让用户重现一遍,拿下日志来看,哦,原来是这个问题。有没有很熟...转载 2018-05-22 13:13:51 · 711 阅读 · 0 评论 -
程序员你为什么这么累?AOP实现
我们需要在AOP里面统一处理异常,包装成相同的对象ResultBean给前台。#ResultBean定义ResultBean定义带泛型,使用了lombok。@Datapublic class ResultBean<T> implements Serializable { private static final long serialVersionUID = 1L; pu...转载 2018-05-22 13:12:42 · 721 阅读 · 0 评论 -
程序员你为什么这么累?Controller规范
第一篇文章中,我贴了2段代码,第一个是原生态的,第2段是我指定了接口定义规范,使用AOP技术之后最终交付的代码,从15行到1行,自己感受一下。今天来说说大家关注的AOP如何实现。先说说Controller规范,主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:#统一返回ResultBean对象所有函数返回统一的ResultBean/...转载 2018-05-22 13:11:38 · 937 阅读 · 1 评论 -
程序员你为什么这么累?接口定义常见问题
工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口。接口定义一定程度上能反应程序员的编程功底。列举一下工作中我发现大家容易出现的问题:#返回格式不统一同一个接口,有时候返回数组,有时候返回单个;成功的时候返回对象,失败的时候返回错误信息字符串。工作中有个系统集成就是这样定义的接口,真是辣眼睛。这个对应代码上,返回的类型是map,json,object,都是不应该的。实际工作...转载 2018-05-22 13:09:50 · 608 阅读 · 0 评论 -
程序员你为什么这么累?导读
大家一提到程序员,首先想到的是以下标签:苦逼,加班,熬夜通宵。但是,但凡工作了的同学都知道,其实大部分程序员做的事情都很简单,代码CRUD可以说毫无技术含量,就算什么不懂依葫芦画瓢很多功能也能勉强做出来,做个多线程并发就算高科技了,程序员这行的门槛其实还是比较低的。(这里说的是大部分,有些牛逼的,写算法、jvm等的请自动跳过)是不是觉得很矛盾,一方面工作不复杂,一方面却累成狗。有没有想过问题出在哪...转载 2018-05-22 13:05:09 · 539 阅读 · 0 评论 -
程序员你为什么这么累?如何应对需求变更
我之前的文章 程序员你为什么这么累? 中,我个人观点是加班原因是编码质量占了大部分因素,但是不少同学都不认为是代码质量导致的加班,都认为是不断的需求改动导致的加班。这位同学,说的好像别人的需求就不会变动似的!谁的需求不改动啊?不改动的能叫需求吗?哈哈。先看个程序员的段子娱乐一下客户被绑,蒙眼,惊问:“想干什么?”对方不语,鞭笞之,客户求饶:“别打,要钱?”又一鞭,“十万够不?”又一鞭,“一百...转载 2018-05-23 06:52:27 · 1423 阅读 · 0 评论 -
程序员你为什么这么累?工程使用说明
jdkjdk6+。#idea使用了lombok,需要在IDE里面先安装插件。idea中在 plugins里面安装 lombok 插件重启即可。在 Idea 里面选择 source目录导入Maven工程,然后在Tomcat里面运行工程即可。idea 中需要先安装tomcat插件。启动项目,访问地址 http://localhost:8080/+[应用名(可为空)] 即可。#eclipse / sts...转载 2018-05-23 06:52:33 · 471 阅读 · 0 评论 -
程序员你为什么这么累?目录
1、程序员你为什么这么累?导读2、程序员你为什么这么累?接口定义常见问题3、程序员你为什么这么累?Controller规范4、程序员你为什么这么累?AOP实现5、程序员你为什么这么累?日志打印6、程序员你为什么这么累?异常处理7、程序员你为什么这么累?参数校验和国际化8、程序员你为什么这么累?工具类编写9、程序员你为什么这么累?函数编写建议10、程序员你为什么这么累?配置规范11、程序员你为什么这...原创 2018-05-23 06:59:10 · 1624 阅读 · 1 评论 -
在基于散列的Map中使用锁分段技术
1、降低锁竞争的程度:减少锁的持有时间,降低锁的请求频率,使用带有协调机制的独占锁。缩小加锁代码的范围;缩小锁的粒度,对相互对立的共享变量使用不同的锁;对单个锁分解为两个锁,到分解为多个锁的锁分段,使同一时刻可以让更多线程同时操作不同分段锁锁定的分段。2、基于散列的Map实现,其中使用了锁分段技术。它拥有N_LOCKS个锁,并且每个锁保护散列桶的一个子集。大多数方法,列入get,都只需要获得一个锁...原创 2018-06-15 09:05:04 · 306 阅读 · 0 评论