![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
陌小兮123
这个作者很懒,什么都没留下…
展开
-
线程如何停止工作
interrupt()方法中断一个线程,并不是强行停止这个线程,而是对这个线程打个招呼,将线程的中断标记设置为true,线程是否中断由线程本事自己决定isInterrupted()判断当前线程是否处于中断状态static方法interripted()判断当前线程是否处于中断状态,并将中断标记设置为false...原创 2019-10-22 10:05:40 · 207 阅读 · 0 评论 -
多线程
1.实现多线程的三种方式:①继承Thread类②实现runnable接口③通过futureTask包装器来创建Thread线程特点:可以返回值public class FutureTask<V> implements RunnableFuture<V>public interface RunnableFuture<V> extends Runna...原创 2019-01-07 09:19:52 · 176 阅读 · 0 评论 -
CAS的缺点
缺点:虽然很高兴的解决了原子操作问题,但是还存在3大问题①循环时间长开销很大:我们可以看到getAndAddInt方法执行时,如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销②只能保证一个共享变量的原子操作:当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候...原创 2019-01-08 10:00:07 · 446 阅读 · 0 评论 -
面试题
1.笔试常见的问题?面试常见的问题上面给的面试题链接基本都有。我只提几点:1)写SQL:写SQL很常考察group by、内连接和外连接。2)手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,最好还能手写一种其他的排序代码。试想:如果一般面试者都写的冒泡排序,而你写的是快速排序/堆排序,肯定能给面试官留下不错的印象。2.面试流程?1)让你自我介绍 2...原创 2019-01-08 10:16:26 · 388 阅读 · 0 评论 -
线程的中断总结
1.调用一个线程的interrupt() 方法中断一个线程,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的中断标志位置为true,线程是否中断,由线程本身决定.2.isInterrupted()判定当前线程是否处于中断状态。3.static方法interrupted()判定当前线程是否处于中断状态,同时中断标志位改为false。4.方法里如果抛出Interrupte...原创 2019-03-09 00:02:50 · 146 阅读 · 2 评论 -
Lock和Synchronized比较
synchronized代码简洁Lock:获取锁可以被中断,超时获取锁,尝试获取锁可重入锁ReentrantLock:递归调用如果在时间上,先对锁进行获取的请求,一定先被满足,这个锁就是公平锁。否则是非公平的。非公平的效率一般来讲更高。(高在唤醒锁的过程)ReentrantLock和Synchronized都是排他锁,指同一时刻只有一个线程进行访问。读写锁:同一时刻允...原创 2019-03-14 22:41:57 · 204 阅读 · 1 评论 -
Join方法,yield
如果线程A调用了线程B的join方法,线程A必须在线程B执行完之后才能执行线程在执行yield()以后,持有的锁是不释放的sleep()方法被调用以后,持有的锁是不释放的调动方法之前,必须要持有锁。调用了wait()方法以后,锁就会被释放,当wait方法返回的时候,线程会重新持有锁调动方法之前,必须要持有锁,调用notify()方法本身不会释放锁的...原创 2019-03-10 20:11:35 · 228 阅读 · 0 评论 -
Fork/join 分而治之
规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解...原创 2019-03-10 20:45:51 · 82 阅读 · 0 评论 -
ConcurrentHashMap
jdk1.7以前ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment实际继承自可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,每个Segment里包含一个HashEntry数组,我们称之...原创 2019-03-19 22:18:57 · 96 阅读 · 0 评论 -
常见的并发工具类
CountDownLatch作用:是一组线程等待其他的线程完成工作以后在执行,加强版joinawait用来等待,countDown负责计数器的减一CyclicBarrier让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行CyclicBarrier(intparties)CyclicBarrier(intparties, ...原创 2019-03-11 21:58:17 · 154 阅读 · 0 评论 -
Callable,Future,FutureTask
isDone:结束,正常或者异常结束或者自己取消返回trueisCancelled:任务完成前被取消返回truecancel(boolean):任务还没开始返回false 任务已经启动,cancel(true),中断正在运行的任务,如果中断成功,返回true, 任务已经启动,c...原创 2019-03-12 21:38:32 · 106 阅读 · 0 评论 -
AQS深入分析
1.使用到哪些设计模式:模板方法模式:独占式获取accquireacquireInterruptiblytryAcquireNanos共享式获取acquireSharedacquireSharedInterruptiblytryAcquireSharedNanos独占式释放锁release共享式释放锁releaseShared需要子类覆盖的流程...原创 2019-03-17 22:11:03 · 118 阅读 · 0 评论 -
AQS的数据结构
竞争失败的线程会打包成Node放到同步队列,Node可能的状态里cancelled:线程等待超时或者被中断,从队列里移除singal:后续的节点处于等待状态,当前节点执行完之后通知后续的节点执行condition:当前节点处于等待队列propagate:共享,表示状态要往后面的节点传播节点加入到同步队列首节点的变化:独占式同步状态获取和释放...原创 2019-03-18 21:06:23 · 701 阅读 · 0 评论 -
原子操作CAS
sync是基于阻塞的锁的机制。1.被阻塞的线程优先级很高。2拿到锁的线程一直不释放怎么办?3.大量的线程竞争消耗CPU,同时带来死锁和其他安全CAS的原理:CAS(compare and swap),指令级别保证这是一个原子操作。三个运算符:一个内存地址V,一个期望的值A,一个新值B。基本思路:如果地址V上的值和期望的值A相等,就给地址V赋给新值B。如果不是,不做任何操作循环(自...原创 2019-03-13 20:57:47 · 135 阅读 · 0 评论 -
并发容器
1.Hash:散列,哈希,把任意长度的输入通过一种算法,变换成固定长度的输出。这个输出值就是哈希值。属于压缩映射。容易产生哈希冲突。Hash:直接取余法。冲突解决:1.开放寻址。2.在散列。3。链地址法md4,md5,sha属于 hash算法。...原创 2019-03-19 06:42:57 · 84 阅读 · 0 评论 -
Happen-before规则
happens-before定义happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文(《Time,Clocks and the Ordering of Events in a Distributed System》)中提出,有兴趣的可以google一下。JSR-133使用happens-before的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一...原创 2019-03-26 09:29:54 · 278 阅读 · 0 评论 -
Volatile的实现原理
被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。volatile实现原理volatile是怎样实现了?比如一个很简单的Java代码:instance = new Instancce() //instance是volatile变量在生成汇编代码时会在volatile修饰的共享变量进行写操作的时候会多出Lock前缀的指令(具体的大...原创 2019-03-27 11:18:12 · 132 阅读 · 0 评论 -
读取Excel文件,用对象接收数据
@NoArgsConstructor(access = AccessLevel.PRIVATE)@Slf4jpublic final class ExcelUtils { /** * 读取Excel表格的第一个sheet数据到list, 强制实体类成员变量声明顺序与Excel数据列数据一致 * @param file MultipartFile * @...原创 2019-09-24 13:34:26 · 510 阅读 · 0 评论 -
线程池的理解
1.ThreadPoolExecutor类,有corePoolSize:核心池的大小,maxPoolSize:线程池最大线程数,keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止waitQueue:一个阻塞队列,用来存储等待执行的任务ThreadFactory:创建线程的handler:表示当拒绝处理任务时的策略...原创 2018-05-21 14:45:09 · 103 阅读 · 0 评论 -
SpringBoot整合javaMail
再application.properyies中:spring.mail.host=smtp.qq.comspring.mail.username=2077843393@qq.com#授权码g,在QQ邮箱客户端生成 修改成自己的 设置-账户-开启服务-获取授权码spring.mail.password=mxltutotjccpbjggspring.mail.properties.mail...原创 2018-04-26 10:53:58 · 490 阅读 · 0 评论 -
集合整理
1.请讲下Java里面的容器 分两大类,Map和Collection。而Collection又有子接口List(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性) Map是存储键值对的,里面的健不可以重复,但值可以重复a. 对于List主要有ArrayList和LinkedList两种实现。实现的数据结构不同,所以主要的区别也都是和数据结构相关的。 A转载 2017-10-31 22:43:14 · 202 阅读 · 0 评论 -
JVM内存模型
1.重排序:为什么要有重排序:编译时或运行时环境为了优化程序性能而采取对指令的重排序的一种手段.数据的依赖性:如果两个操作同时访问同一个变量,并且2个操作有一个为写操作,此时这俩个操作之间就有依赖关系.总结:在单线程的情况下,指令执行的最终结果与其顺序的执行效果是一致的,否则这种优化就没有意义了.2.内存屏障(Memory Barrier):是一种CPU指令,用于控制特定条件下的重原创 2018-01-06 11:54:49 · 117 阅读 · 0 评论 -
java消息中间件
1.JMS:java message service,用于2个应用之间调用,实现消息的异步通信2.AMQP:advance message queue protocal3.activceMq,rabbtiMq,kafka4.队列和主题模式5.spring集成jms连接activeMq:有三要素,1.connectionFactory,提供数据源.2JmsTemplate用于发送和接收消息的模板 ...原创 2018-02-26 21:01:04 · 116 阅读 · 0 评论 -
JVM高级特性和最佳实践书籍总结
第一部分:Java内存区域与内存溢出异常java程序在运行时,会把管理的内存划分为:方法区,虚拟机栈,本地方法栈,堆,程序计数器1.程序计数器:是一块较小的内存区域,它的作用可以看做当前线程所执行的字节码的行号指示器。在虚拟机中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式。因此为了线程切换后能恢复...原创 2018-02-13 16:37:57 · 266 阅读 · 0 评论 -
Timer类的学习
1.首先创建一个类继承TimerTask,实现run方法;public class MyTimerTask extends TimerTask{ private String name; public MyTimerTask(String name) { this.name = name; } public void run() { ...原创 2018-02-27 21:02:48 · 165 阅读 · 0 评论 -
java的时间问题
1.计算2个日期之间的天数在测试工作中经常会使用到比较两个日期相差的天数,我之前用过实现这一功能的两个版本的方法,源代码如下:(版本1)publicstaticint getIntervalDays(Date fDate, Date oDate) { if (null == fDate || null == oDate) { return -1; } ...原创 2018-02-28 10:49:05 · 280 阅读 · 0 评论 -
从Mysql查询的结果,写入txt文件中,每个字段用|分隔,下一条数据要换行
1.首先创建文件public static boolean createFile(String fileName, List<?> dtoList, Class<?> clazz, String path) { logger.debug("createFile start "); Boolean bool = false; String f...原创 2018-03-15 10:33:53 · 2578 阅读 · 0 评论 -
从数据库查询到的数据导出到excel中
步骤一:封装数据List<Map<String, String>> result = new ArrayList<>();Map<String, String> map = new LinkedHashMap<>();map.put("U_ID", "...");...result.add(map);步骤二原创 2018-03-02 10:15:10 · 3624 阅读 · 1 评论 -
SpringBoot总结:
一:AOP拦截:创建一个类,加上@Aspect和@Component注解,定义一个公用方法,加上@PointCut注解,设置你要拦截的方法,再创建一个方法,加上@Before或者@After,指向公用方法的名字.获取请求路径,以及参数,通过RequestContextHolder获取public void doBefore(JoinPoint joinPoint) { ServletR...原创 2018-02-25 20:05:12 · 246 阅读 · 0 评论 -
堆栈详解
栈是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。为什么要划分堆和栈1、从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。2、堆...原创 2018-03-22 14:59:49 · 233 阅读 · 0 评论 -
Mybatis详解
1.优点:①不屏蔽Sql,可以对sql进行优化和改造 ②提供强大,灵活的映射机智。提供动态Sql. ③在mybatis中,提供了使用Mapper的接口编程。只要一个接口和一个Xml就能创建映射器。2.组件:SqlSessionFactoryBuilder(构造器):会根据配置文件或者代码生产SqlSessionFactory,采用的是分步构建的Build...原创 2018-03-19 12:11:14 · 336 阅读 · 0 评论 -
SpringBoot实现文件上传和下载
SpringBoot后台如何实现文件上传下载?最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。单文件上传// 单文件上传@RequestMapping(value = "/upload")@ResponseBodypublic String uploa...原创 2018-03-13 12:52:06 · 506 阅读 · 0 评论 -
分布式session一致性问题
什么是session?服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。W...原创 2018-03-22 09:56:49 · 194 阅读 · 0 评论 -
dubbo框架及dubbo环境搭建
第一:介绍Dubbo背景 大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负...原创 2018-03-26 13:54:33 · 209 阅读 · 0 评论 -
两阶段提交协议和三阶段提交协议
JEE的XA协议就是根据两阶段提交来保证事务的完整性,并实现分布式服务化的强一致性。两阶段协议提交的流程 ①准备阶段:协调者向参与者发起指令,参与者评估自己的状态。如果参与者评估指令可以完成,则会写redo或者undo的日志,然后锁定资源,执行操作,但不提交②提交阶段:如果每个参与者明确返回准备成功,也就是预留资源和执行操作成功,则协调者向参与者发起提交指令,参与者提交资源变更的事务,释放锁定资源...原创 2018-04-09 12:35:08 · 571 阅读 · 0 评论 -
限流详解
限流的目的是通过对并发访问/请求进行限速.一旦达到限制速率则可以拒绝服务.限流算法:令牌桶 漏桶 计数器令牌桶算法:是一个存放固定容量令牌的桶,按照固定的速率往桶里添加令牌.当桶满时,新添加的令牌被丢弃或者拒绝....原创 2018-05-02 21:02:04 · 442 阅读 · 0 评论 -
Redis详解
1. 使用redis有哪些好处?(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)(2) 支持丰富数据类型,支持string,list,set,sorted set,hash(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会...原创 2018-05-03 09:32:02 · 94 阅读 · 0 评论 -
为什么重写了equals方法后,还要重写hashcode方法
1.重写了equals之后还要重写hashcode方法,是为了map,set集合等类型的使用.①:map和set必须保证对象的唯一.②:集合类判断对象是否相等,是先比较equals是否相等,如果相等则返回true.还要继续判断hashcode返回值是否为true,只有两者都为true,则认为两个对象相等.2.由于object的hashcode返回的是hash值,即使equals返回的是true原创 2017-10-14 22:38:27 · 701 阅读 · 0 评论