java
文章平均质量分 53
wondertang
专注同城极速配送
展开
-
动手写一个二叉平衡树
前面已经实现了一个二叉搜索树比较复杂的就是在删除的时候,需要做比较多的判断,总体没那么难理解。在二叉树的基础上,有一个叫做二叉平衡树的数据结构,实现起来难度还是比较大的。具体代码可参考:AVLTree...原创 2019-11-30 14:30:29 · 325 阅读 · 0 评论 -
动手写一个二叉搜索树
前面已经手写了一个简单的双向链表在此基础上再写一个简单的二叉搜索树【这里仅简单实现】。二叉搜索树在结构上跟双向链表比较相似,将左节点看做左子树,将右节点看做父节点,只是多个右字数的对应。package com.tree;import java.util.List;/** * 实现二叉搜索树(又叫二叉排序树) * 先思考正常情况,再考虑特殊情况,否则会进入到死胡同 * @aut...原创 2019-11-30 14:19:10 · 337 阅读 · 0 评论 -
动手写一个双向链表
单向链表就不写了,进来直接写双向链表。首先需要了解双向链表的接口。将链的节点抽象为一个对象,对象存在两个指针,一个指向前面一个节点,一个指向后面一个节点。实现双向链表的功能就是对链的指针操作。package com.linked;/** * 实现双向链表 * @author T */public class LinkedTable<T> { private No...原创 2019-11-14 14:03:39 · 368 阅读 · 0 评论 -
BeanUtils.copyProperties解决null值覆盖问题
这里使用的是Spring提供的BeanUtils的工具类(commons-lang3可参考)。在做数据变更的时候,使用BeanUtils.copyProperties(newdata,dbdata)进行数据变更的时候,由于前台展示的数据不完整。导致前台传递的数据将后台的原始数据全部覆盖掉。那么如何解决这种null值的覆盖呢。BeanUtils.copyProperties()可以通过添加可变长参数...原创 2019-10-18 09:58:55 · 10202 阅读 · 4 评论 -
一个例子理解ThreadPoolExecutor
一个例子理解线程池的执行过程,及参数的配置。package com.threadpool;import java.util.concurrent.*;/** * 自定义的线程池 * * corePoolSize核心线程1个: * 没有任务需要执行的时候线程池的大小,如果任务数比较多会开启其他线程,但是不会超过最大线程数。 * 在刚刚创建ThreadPool...原创 2018-08-21 12:50:22 · 1333 阅读 · 0 评论 -
CyclicBarrier用法
前面介绍了CountDownLatch,可以实现计数。达到指定的数后,就会同时执行。 那么CyclicBarrier跟CountDownLatch实现的功能差不多。import java.util.Random;import java.util.concurrent.*;/** * await()就好比是屏障,经过指定数量的屏障才可以执行最后的线程。 * 或者说是一直等待,直到aw...原创 2018-08-23 18:59:44 · 3922 阅读 · 0 评论 -
CountDownLatch用法
官方定义:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 有道翻译:一种同步辅助程序,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。个人理解,实际就是一个倒计时计数...原创 2018-08-23 17:47:31 · 225 阅读 · 0 评论 -
动手写一个阻塞队列
之前看队列,都是停留在看和使用的阶段。再次看队列的时候,忽然发现并没有深入到底层。比如:阻塞队列时如何阻塞的呢?是监听,还是等待呢?然后看着看着就看到了Lock和ReentrantLock,为什么不使用synchronized呢?为什么使用Condition,Condition是什么呢?wait,notify,notifyAll和await,signal,signalAll有什么区别呢?能不能...原创 2018-08-20 11:59:43 · 5887 阅读 · 5 评论 -
记学习线程池过程中遇到的一个坑
这篇实际上是跟上一篇想实现的功能一样,想完成线程状态的跟踪。通过学习线程池,了解到了:ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);这个线程池可以完成实现心跳检测的功能。所以就想想用它来实现一个监听器的功能,定时的监听我开启的线程状态,如果某个线程出...原创 2018-08-22 16:46:28 · 875 阅读 · 0 评论 -
HashMap和LinkedHashMap
转自:https://blog.csdn.net/justloveyou_/article/details/71713781HashMap的结构:数组+链表 可以解决快速查找问题,但是HashMap是无序的。如果想要一个有序的Map该怎么办呢?使用LinkedHashMap类怎么实现有序的存储呢? 对HashMap进行了一层包装,HashMap使用的是单向链表,而LinkedHas...转载 2018-08-19 12:29:34 · 159 阅读 · 0 评论 -
一个线程池处理线程死亡造成的血案
真不知道大家有没有遇到过这种问题: 1.任务处理一半,线程挂了怎么办? 2.线程池有没有补齐线程的功能?这里举一个小demo,用来处理线程死掉,重启线程处理任务。 并未使用多个线程,而是使用一个线程来处理:在抓去到异常的时候,在catch中将该任务重新调用。import java.util.concurrent.ExecutorService;import ja...原创 2018-08-21 14:43:26 · 6911 阅读 · 4 评论 -
观察者模式管理多个线程
如果有多个线程在执行,其中的某一个线程死掉了怎么办呢?如上一篇所说,可以通过线程池的形式重启该线程。本次不在使用线程池,而是通过JDK自带的观察者来实现:如果有线程死掉,重新启动该线程。观察者模式的思想是定义观察者和被观察者,使用观察者来管理被观察者。观察者:import java.util.Observable;import java.util.Observer;/** * ...原创 2018-08-21 17:23:34 · 740 阅读 · 0 评论 -
单例模式双重校验
单例模式从开始学习java就听说过,理解单例模式的作用很简单,写一个单例模式并没有那么接单。单例模式双重校验的再理解双重校验模式是写单例模式时经常见到的,但是双重校验也有很多的坑。 是否会有问题呢?volatile关键字真的可以解决单例模式么?使用内部类能够实现单例模式?为什么?引入思考。同时推荐上面那边文章,以图形的方式说明指令重排的问题,非常通俗易懂。...转载 2018-09-10 15:21:30 · 3209 阅读 · 0 评论 -
maven配置多环境springboot配置多环境
Java项目多环境配置Maven方式使用SpringbootMaven方式使用maven 本地环境、开发环境 、测试环境、生产环境打包。在平常开发的过程中,我们的项目配置文件经常有有几套分别对应自己本地的环境、开发环境、测试环境、以及生产环境。因为在不同的环境中项目的相关配置也会有相关的不同,我们在不同的环境中部署就要手动修改为对应环境的配置,这样太麻烦了以及这样也会很容易出错。目前JAV...转载 2019-02-25 11:56:04 · 1286 阅读 · 1 评论 -
SpringMVC Controller单例和多例,静态变量和普通成员变量
对于SpringMVC Controller单例和多例,下面举了个例子说明下.第一次:类是多例,一个普通属性和一个静态属性。参考:https://blog.csdn.net/qq_27026603/article/details/67953879同样的结果,可以引申到struts2,和其他多线程问题。在多线程的环境下,是否存在静态变量不安全的问题。...转载 2019-03-22 09:37:25 · 3369 阅读 · 1 评论 -
HashMap和HashTable到底哪不同
转自:http://www.cnblogs.com/xinzhao/p/5644175.htmlHashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里时间 HashTab...转载 2018-08-19 10:22:49 · 154 阅读 · 0 评论 -
字符编码问题
为什么字符串经过几轮转换,打印或者显示出来的中文就乱码了? 为什么文件的内容,读出来然后打印或者显示出来就乱码了呢?可能是你没有搞懂编码问题转载:https://blog.csdn.net/yrc_Note/article/details/69183865...转载 2018-08-18 22:52:09 · 129 阅读 · 0 评论 -
并发编程(15)-CAS原理详解
前言在网上找了N多篇有关讲述多线程CAS原理的文章,全是千变一律的原始值、预期值、新值。真的不知所云,有可能大多数作者自己都没有弄明白到底是怎么各原理和流程。最后找到了这篇文章,写的很清楚,做一些记录。什么是CAS在jdk 1.5中增加的一个最主要的支持是Atomic类,比如说AtomicInteger, AtomicLong,这些类可帮助最大限度地减少在多线程中对于一些基本操作(例如...转载 2018-04-26 12:06:46 · 171 阅读 · 0 评论 -
并发编程(5)-volatile
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。volatile关键字虽然从字面上理解起来比较简单,但是要用好不原创 2017-11-04 20:48:53 · 177 阅读 · 0 评论 -
并发编程(2)-多个线程多个锁
对象锁和类锁package com.thread.mythread.conn002;public class MultiThread { private int num = 0; public synchronized void printNum(String tag){ try { if("a".equals(tag)){原创 2017-11-04 16:08:47 · 181 阅读 · 0 评论 -
并发编程(4)-脏读
package com.thread.mythread.conn004;public class DirtyRead { private String username = "zhangsan"; private String password = "123"; public synchronized void setValue(String username,String pa原创 2017-11-04 17:13:16 · 485 阅读 · 0 评论 -
并发编程(1)-概念
线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”“临界区”。public class MyThread extends Thread{ private int count = 5; public void run() {原创 2017-11-04 15:18:55 · 187 阅读 · 0 评论 -
并发编程(3)-一个对象一个锁
延续上一篇,这一篇展示记录一个对象一把锁的demopackage com.thread.mythread.conn003;public class MyObject { public synchronized void method1(){ try { System.out.println(Thread.currentThread().getName()原创 2017-11-04 16:27:50 · 177 阅读 · 0 评论 -
并发编程(12)-Master-Worker
Master-Worker模式是常用的并行计算模式。他的核心思想史系统由两类进程协作工作:master进程和worker进程。master负责接收和分配任务,worker负责处理子任务。当各个worker子进程处理完成后,会将结果返回给master,由master做归纳和总结。其好处是将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。原创 2017-11-06 22:57:00 · 236 阅读 · 0 评论 -
并发编程(11)-Future模式
Future模式有点类似于商品订单。比如在网购时,当看中某一个商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可继续浏览或操作其他内容。原创 2017-11-05 21:55:10 · 253 阅读 · 0 评论 -
两个数组合并,去同存异
还在用for循环遍历吗,试试这种方式public static void main(String[] args) { String[] strArray1 = {"fengshuo","jinjin","liusheng","zhaoqiang"}; String[] strArray2 = {"jinjin","zhaoqiang","xiaoxiao","luji原创 2015-11-26 10:14:34 · 397 阅读 · 0 评论 -
并发编程(6)-线程之间的通信
线程通信的概念:线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程之间的通信就成为整体的比用方法之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会是开发人员对线程任务在处理的过程中进行有效的把控与监督。 使用wait和notify方法实现线程之间的通信,(注意这两个方法都是object的类的方法,换句话说java为所有的对象都提供了这两个原创 2017-11-04 22:11:16 · 167 阅读 · 0 评论 -
并发编程(7)-阻塞队列
BlockingQueue:顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据。我们要实现LinkedBlockingQueue下面两个简单的方法put和take。 put(anObject):把anObject加入到BlockingQueue里面,如果BlockingQueue没有空间,则调用此方法的线程被阻断,直到BlockingQueue里面有空间再继续。 take:取走原创 2017-11-05 10:31:13 · 149 阅读 · 0 评论 -
并发编程(14)-线程池
1.Executor为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制。他们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,他扮演者线程工厂的角色,我们通过Executors可以创建特定功能的线程池。 Executors创建线程的方法: newFixedThreadPool()方原创 2017-11-15 22:09:35 · 230 阅读 · 0 评论 -
并发编程(13)-生产者消费者
生产者和消费者是一个非常经典的多线程模式,我们在实际开发中应用非常广泛的思想理念。在生产-消费模式中:通常由两类线程,即若干个生产者的线程和若干个消费者的线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务,在生产者和消费者之间通过共享内存缓存区进行通信。 创建队列需要的data类:public final class Data { private S原创 2017-11-07 18:05:09 · 205 阅读 · 0 评论 -
网络编程(2)-socket
1.简介Socket又称“套接字”,应用程序通常通过“套接字“向网络发出请求或者应答网络请求。 socket和serversocket类库位于java.net包中。serversocket用于服务器端。socket是建立网络连接使用的。在连接成功时,应用程序两端都会产生一个socket实例。操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或在客户端而产生不同级别原创 2017-11-15 22:47:18 · 170 阅读 · 0 评论 -
网络编程(1)-基本概念
1.OSI分层模型和TCP/IP分层模型的对应关系2.七层模型与协议的对应关系网络层 ———— IP(网络之间的互联协议) 传输层 ———— TCP(传输控制协议)、UDP(用户数据报协议) 应用层 ———— Telnet(Internet远程登录服务的标准协议和主要方式)、FTP(文本传输协议)、HTTP(超文本传送协议)3.IP地址和端口号1)ip地址用于原创 2017-11-21 21:58:21 · 394 阅读 · 0 评论 -
网络编程(3)-BIO,NIO,AIO
本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解。 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端。 代码的所有说明,都直接作为注释,嵌入到代码中,看代码时就能更容易理解,代码中会用到一个计算结果的工具类,见文章代码部分。 相关的基础知识文章推荐: Linux 网络 I/O 模型简介(图文转载 2017-11-18 21:57:53 · 454 阅读 · 0 评论 -
并发编程(10)-queue
1.ConcurrentLinkedQueueconcurrentLinkedQueue是一个适用于高并发场景下的队列,通过无锁的方式,实现高并发状态下的高性能,通常concurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的,该队列不允许null元素。 concurrentLi原创 2017-11-05 17:17:17 · 393 阅读 · 0 评论 -
并发编程(9)-同步类容器和并发类容器
1.同步类容器同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护符合操作。符合类操作如:迭代(反复访问元素,遍历完容器中国所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期原创 2017-11-05 15:23:01 · 195 阅读 · 0 评论 -
并发编程(8)-单例和多线程
1.ThreadLocalThreadLocal概念:线程局部变量,是一种多线程间并发访问变量的解决方案,与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在高并发原创 2017-11-05 13:36:12 · 147 阅读 · 0 评论 -
java动态代理的两种实现方法
Java动态代理的两种实现方法AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。转载 2017-10-17 17:43:59 · 211 阅读 · 0 评论