
后端开发
qq_36556651
这个作者很懒,什么都没留下…
展开
-
敏捷软件开发-薪水支付案例学习
员工薪水支付系统介绍很早以前学习了敏捷软件开发:原则、模式与实践中的薪水支付案例,有些代码设计思想觉得特别好的,特来分享下。本系统实现了一个计算员工薪水,并发放薪水的功能,该系统必须为不同类型的员工支付正确的薪水,员工类型和结构如下:有些员工是钟点工。会按照他们工作记录中每小时报酬字段的值对他们进行支付。他们每天会提交工作时间卡,其中记录了日期以及工作小时数。如果每天工作超过8小时,那么超...原创 2019-05-19 19:45:47 · 1349 阅读 · 0 评论 -
Java多线程基础(2):实现多线程的方式
Java实现多线程的方式主要有4种,直接上代码。继承Thread类最基础的方式,缺点是不能多继承。public class MyThread extends Thread { public MyThread() { } @Override public void run() { // TODO Auto-generated method stub //需要在多线...原创 2019-06-02 14:40:49 · 138 阅读 · 0 评论 -
Java多线程基础(3):解决多线程安全问题
当多个线程并发访问同一个数据时,往往会产生线程安全问题,Java提供了线程锁机制来保证多线程的同步。导致线程安全问题的原因:1.是否有多线程环境。2.多个线程间是否有共享数据。3.是否同时有多条语句操作共享数据。解决线程安全问题的方法:把操作共享数据的代码给锁起来,让任意时刻都只有一个线程执行。同步代码块用synchronized关键字把需要同步的代码包起来,当线程访问时,会去获...原创 2019-06-02 15:22:06 · 168 阅读 · 0 评论 -
Java多线程基础(4):线程本地存储
之前在牛客网的中级项目实战中,有使用线程本地存储ThreadLocal来保存登录用户的信息,以便后续调用,这里专门记录下它的特性。线程本地存储在多线程里的应用是解决多任务对共享资源的冲突问题,它可以根除对变量的共享,它可以为使用相同变量/对象的每个不同线程都创建不同的存储,将为每个线程管理其各自的副本。如下是一个通过ThreadLocal来管理各自Integer对象的案例:public cl...原创 2019-06-02 16:14:04 · 411 阅读 · 0 评论 -
Java多线程基础(5):volatile关键字应用
我曾经在工作中写过一个多线程的程序,它需要把while循环放到多线程里不断地执行,但是这样线程就不会停止了,一开始我想过在某个时刻调用interrupt()方法停掉线程,但是这样其实是不好的,当时有个同事和我说可以设计一个boolean型开关,当想让该循环的多线程运行时就把它设为true,想跳出循环时便设为false,可优雅的关闭和开启多线程,就用到了volatile关键字,这里记录下它的应用。...原创 2019-06-02 16:36:41 · 157 阅读 · 0 评论 -
Java多线程基础(6):捕获多线程内的异常
多线程内抛出的异常,是不能正常通过try-catch来捕获并处理的,需要通过UncaughtExceptionHandler接口,它可以在每个Thread对象上附上异常处理器,并在线程抛出异常时被调用,我们只需通过ThreadFactory在每个新建的Thread对象上附上UncaughtExceptionHandler即可。正常的异常处理机制无法捕获异常:public class Excep...原创 2019-06-02 18:27:47 · 248 阅读 · 0 评论 -
Java多线程基础(7):多线程间通信等待唤醒机制
线程间的通信就是指不同线程间针对同一资源的操作和处理过程。下面是个通过等待唤醒机制来进行生产和消费学生类的案例:学生类:public class Student { String name; boolean flag; public String getName() { return name; } public void setName(String name) { th...原创 2019-06-02 19:01:26 · 287 阅读 · 0 评论 -
Java多线程基础(8):生产者-消费者和队列
利用wait()和notify()实现任务间的协同合作其实是一种非常低级的方式,我们还可以使用同步队列来解决任务协作问题,BlockingQueue在任何时刻都只允许一个任务插入或者移除队列,如果消费者试图从队列中获取元素,而此时该队列为空,那么队列可挂起消费者,当队列内有元素时再恢复消费者任务。比wait()和notify()更简单好用。有这么一个事件,需要制作吐司供顾客食用,而吐司的制作分三...原创 2019-06-02 21:58:00 · 581 阅读 · 0 评论 -
Java的反射机制
Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性,Java反射就是通过Class文件对象去使用自身类的成员变量 、构造方法、成员方法等属性。我们无法new出一个Class对象,因为其构造函数为private,这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象。...原创 2019-06-03 23:06:06 · 120 阅读 · 0 评论 -
springmvc请求处理流程
springmvc是spring框架的一个模块,springmvc是一个基于mvc的web框架。mvc是一种设计模式,指model-javabean、view-jsp和controller-servlet,,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑交由controller处理,处理结果根据面向对象思想封装成javabean对象,交view层渲染,在改进和个性化定制界面及用户交...原创 2019-06-15 22:55:02 · 211 阅读 · 0 评论 -
Java网络编程UDP协议发送和接收数据
在工作中有涉及用Java实现UDP协议传输和接收数据,因为之前学习网络编程的时候这块没怎么认真关注,这里补充记录下。UDP协议发送数据public class UdpSendDemo { public static void main(String[] args) { // TODO Auto-generated method stub DatagramSocket d...原创 2019-06-23 10:40:11 · 701 阅读 · 0 评论 -
Java网络编程TCP协议发送和接收数据
客户端给服务端发送数据包。TCP协议发送数据public class TcpSendDemo { public static void main(String[] args) { // TODO Auto-generated method stub Socket s=null; OutputStream os=null; try { s=new Socke...原创 2019-06-23 10:46:18 · 1216 阅读 · 0 评论 -
Synchronized和ReentrantLock的区别
Synchronized和ReentrantLock的作用都可以在多线程中对于共同访问的资源进行加锁,它们的区别在这这里记录下。1.锁的实现ReentrantLock是JDK实现的 Synchronized 是JVM实现;前者可以直接看到源码,后者实现难以看到。2.性能的区别在JDK1.6之前,Synchronized的性能是比ReenTrantLock差很多的,但是自从Synchron...原创 2019-08-03 15:59:01 · 162 阅读 · 0 评论 -
Java多线程基础(1):Thread常用方法
Java多线程博大精深,深入学习可以学很久,先一点点地记录。学习多线程前,都会接触到进程和线程相关的概念:进程:正在执行的应用程序,单CPU在某一时间点上只能做一件事,而我们平常电脑执行的多进程,是CPU在做着程序间的高效切换让我们觉得是同是进行着多进程,多进程可以提高CPU的使用率。线程:线程是进程的执行单元,在同一个进程(程序)内可以执行多个任务,每个任务都可以看作是一个线程,多线程意...原创 2019-06-02 12:00:16 · 195 阅读 · 0 评论 -
Spring面向切面的基础—动态代理
Spring里有个概念叫面向切面编程(AOP),我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。它的基础是动态代理,这里记录下动态代理的相关使用。比如,当我们在注册用户时,想校验用户,而需要校验用户的地方又很多,可能登录也要,如果每个方法里都放置校验码,那样...原创 2019-06-07 14:54:10 · 454 阅读 · 0 评论 -
牛客网中级项目学习笔记-表字段建立
牛客网中级项目需要用到的SQL表本次项目所用到的几张表,有些字段设计的特别巧妙,特来记录分享下。login_ticket表login_ticket表的最后一个status字段用来表示用户的过期信息,0有效登录,1无效登录,默认不删除数据,设置为1即为注销(确实随意删除数据不是个好事,不方便追溯)。user表user表的设计上,为了保证密码的安全性,设计了salt字段,在用户创建时随机生...原创 2019-05-12 16:22:38 · 801 阅读 · 1 评论 -
牛客网中级项目学习笔记-返首页数据给前端
首页资讯数据返回设计牛客网的中级项目内容是搭建一个仿头条资讯的网站,包括用户登录注册、查看资讯、创建资讯、点赞资讯、站内消息等等。本次记录下这个项目在前后端数据返回代码设计上的亮点,一般我们熟知的后端返前端数据是通过JSON格式,本次项目在后端返前端新闻资讯时是把一条条新闻资讯先存入创建的Map集合对象,再统一存入list返给前端。ViewObject类即包装了一个Map:public ...原创 2019-05-12 16:51:39 · 667 阅读 · 3 评论 -
牛客网中级项目学习笔记-登录注册
登录注册业务的实现登录注册的业务层实现统一在UserService中,值得注意的是,通过Map集合来返回业务层的处理结果给Controller。在注册方法中,注册失败会通过Map存储注册失败原因,注册成功会存储注册成功的ticket,并在Controller层将ticket存入cookie,ticket用于存储用户登录信息。通过校验时,为了保证用户密码安全性,随机生成salt值与passwo...原创 2019-05-12 17:05:30 · 725 阅读 · 0 评论 -
HashMap源码解析
最近看了下HashMap的源码,来记录下它的实现原理。HashMap最一开始是一个基于链表的数组结构,数组的每一个索引位置上都链着具有相同hash计算结果的键值对数据,为了提高查找效率,jdk1.8以后当数组某个索引位置的节点数大于8时,会自动转换为红黑树。首先要了解HashMap的静态内部类Node<K,V>,即数组索引位置上的链表节点,它继承自Map.Entry<K,V&...原创 2019-05-25 16:35:15 · 124 阅读 · 0 评论 -
牛客网中级项目学习笔记-拦截器获取用户信息
拦截器HandlerInterceptor拦截器可拦截前端发过来的请求,可用于登录拦截、获取用户或者权限校验。HandlerInterceptor方法介绍:boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void pos...原创 2019-05-12 18:58:23 · 579 阅读 · 0 评论 -
牛客网中级项目学习笔记-点赞点踩功能实现
Redis在用户赞踩功能中的应用用户点赞一条资讯,该资讯的点赞数量增加,点踩则踩数量增加,本项目的点赞点踩功能是通过redis数据库实现的,java操作redis数据库的工具类可用Jedis库。1.需要在pom.xml中引入jedis的jar包:<dependency> <groupId>redis.clients</groupId> <...原创 2019-05-12 20:55:12 · 1665 阅读 · 0 评论 -
牛客网中级项目学习笔记-异步消息处理
Redis异步消息处理机制写在前面,其实实现异步队列可以用到BlockingQueue同步队列,不过本次我们用Redis的list数据结构来作为异步机制的先进先出队列。点赞、回复评论的时候,表面上是赞数增加了,其实还有很多其他的工作要做。比如,对方要收到消息提醒,成就值增加。一些行为会引起一系列连锁反应。如果在点赞时立马处理,会影响程序运行效率,所以大型服务需要异步化。redis异步处理的实...原创 2019-05-12 21:13:27 · 660 阅读 · 0 评论 -
ArrayList源码解析(1)
ArrayList是Java的集合类,底层数据结构是动态数组,查询快,增删慢,按照插入的先后顺序保存元素。现在来看看它的源码实现。先看看它的成员变量: /** * 序列号,序列化时使用 */ private static final long serialVersionUID = 8683452581122892189L; /** * 数组默认容量 ...原创 2019-05-25 19:15:18 · 79 阅读 · 0 评论 -
ArrayList源码解析(2)
ArrayList里还有个迭代器的概念,用来遍历集合的,有Iterator、ListIterator两种,主要区别在于前者是单向移动遍历,ListIterator可以双向移动遍历。Iterator的功能:next()获取集合中的下一个元素;使用hasNext()检查是否还有元素可获取;使用remove()将迭代器新近返回的元素删除。实现迭代器需要继承Iterable接口,并实现其方法...原创 2019-05-25 22:55:07 · 122 阅读 · 0 评论 -
LinkedList源码解析(1)
LinkedList也像ArrayList一样实现了基本的List接口,它相对于ArrayList来讲在插入和删除元素操作方面要更高效,但是在随机查询元素操作方面要逊色些。接下来分析下LinkedList的内在结构。LinkedList底层是基于双向链表的实现,核心是用Node节点存储元素:private static class Node<E> { E item...原创 2019-05-26 16:22:18 · 114 阅读 · 0 评论 -
LinkedList源码解析(2)
这篇记录下LinkedList的迭代器实现。LinkedList的源码内记录了两种迭代器ListIterator和DescendingIterator,一开始很奇怪,平常用的Iterator迭代器实现却没看到,后面看了LinkedList的继承关系才知道答案。public class LinkedList<E> extends AbstractSequentialList&...原创 2019-05-26 16:36:47 · 128 阅读 · 0 评论 -
Web服务相关知识总结
Java Web技术的学习量不亚于JavaSE,这里记录下相关的一些概念。网址url结构一个网址的结构一般是这样:http://www.sina.com(这里以新浪为例),其中sina.com称之为域名,www.sina.com称为主机名,http://www.sina.com即访问的URL地址。Tomcat目录层级结构bin—存放启动、关闭tomcat的脚本文件。conf—存放Tomc...原创 2019-06-06 23:41:35 · 282 阅读 · 0 评论 -
Java远程监控ActiveMQ消息队列
因为公司的产品架构有用到ActiveMQ消息队列,在之前的压力测试上有发现ActiveMQ存在消费不过来的情况,这里记录下在Linux系统下如何实现通过Java对ActiveMQ消息队列的监控。Java是通过配置JMX来监控ActiveMQ的消息队列的,这里用到消息队列工具类,放下实现类:import java.io.IOException;import java.util.Priorit...原创 2019-08-19 23:24:10 · 2332 阅读 · 1 评论