logo头像

BUG本天成,妙手偶得之

探索JAVA并发 - 如何减少锁的竞争

探索JAVA并发 - 如何减少锁的竞争

锁的竞争会限制代码的可伸缩性,在并发编程时通过一些手段有意地减少锁竞争,可以让程序有更好的表现。 所谓可伸缩性,即当增加计算资源(如CPU、内存、带宽等)时,程序的吞吐量或处理能力会相应增加。这个时候,我们当然希望增加的效果越明显...

跨域Access-Control-Allow-Origin解决方案

跨域Access-Control-Allow-Origin解决方案

前端访问其它域名的资源往往会失败,那是因为浏览器出于安全考虑禁止了不同源的资源。 同源策略 同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指,域名,协...

探索JAVA并发 - 线程池详解

线程池是并发编程中必不可少的一种工具,也是面试高频话题。 线程池,即管理着若干线程的资源池(字面意思)。相比于为每个任务分配一个线程,在线程池中执行任务优势更多: 线程复用:线程池中的线程是可以复用的,省去了创建、销毁线程的开销...

源码分析 - JVM关闭钩子的注册和调用

通过关闭钩子,我们可以在应用关闭时做一些自定义的操作,让程序更优雅的结束。 JAVA程序运行在虚拟机上(JVM),JAVA程序执行完成,JVM也随之关闭。关闭的方式有多种,根据其行为的文明程度可大概分为两种: 正常关闭 所有普...

JAVA泛型与类型擦除

JAVA泛型与类型擦除

泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中。泛型是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,即类型擦除。 ...

探索JAVA并发 - 如何处理线程中断

中断是一种协作机制,通过这种机制可以要求指定线程在可以暂停的地方停止当前任务,但这个要求可以无视,我们也经常这么做(虽然不好),那应该这么对待其它线程发来的中断要求呢? 在上一篇如何优雅地取消线程任务中提到了通过中断可以取消线程正...

探索JAVA并发 - 如何优雅地取消线程任务

通过线程启动一个异步的任务很容易,但想让它提前安全且快速地结束确并不简单。如果线程外部的代码可以提前把目标线程置为“完成”状态,那么这个目标线程就是可取消的。 线程任务取消的原因一般有如下几种: 用户请求取消: 比如用户发起一个...

探索JAVA并发 - 同步工具类

同步工具类是个笼统的概念,它可以根据自身状态来协调线程的控制流,了解JAVA中常用的同步工具能帮助开发者写出更好的并发代码。 闭锁 CountDownLatch闭锁的作用相当于一扇门,在这扇门没打开前,任何线程执行到这里都会被无情...

探索JAVA并发 - ThreadLocal

使用ThreadLocal可以维持线程封闭性,使线程中的某个值与保存值的对象关联,防止对可变的单例变量或全局变量进行共享,但使用不当也会造成内存泄漏,先了解它,再使用它​。​ 从SimpleDateFormat说起SimpleDa...

死锁的四大条件与处理策略

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 比如:两个线程A、B...