- 浏览: 169605 次
- 性别:
- 来自: 杭州
最新评论
文章列表
【Java核心-进阶】线程池(Executor)
- 博客分类:
- Java
线程池主要类概览
Executor
Executor的初衷是将 任务提交 和 任务执行的细节 解耦。 只有一个提交任务的方法:
void execute(Runnable command);
ExecutorService
虽然我们习惯将ExecutorService称为线程池,但它并不是简单的线程“池”。它提供了比较全面的 线程管理 与 任务提交 等方法,如 shutDown、submit。 submit 可以解决 Runnable 无法返回结果的困扰; 其返回的Future提升了任务的可操控性,弥补了 execute 方法的不足:
Futur ...
参考:
《In ArrayBlockingQueue, why copy final member field into local final variable?》
《Performance of locally copied members ?》
JDK源码中经常会出现一种代码模式:将类成员变量复制到方法本地变量上。 如:String.compareTo() 方法中会将类成员 ...
【Java核心-进阶】并发队列
- 博客分类:
- Java
JDK并发队列概览
典型特性
Queue vs Deque
Deque 是 双端队列,它的侧重点是支持队列首尾都能添加删除元素。Deque 提供了更多方法,如典型的 offerLast(e),pollLast()
Blocking vs 非Blocking
Blocking表示队列提供了“等待性”相关操作。如,获取元素时会等到队列中有元素时再返回;添加元素时会等到队列有空间时再添加。
/**
* Inserts the specified element into this queue, waiting if necessary
* for ...
Java的内存模型中某些“奇技淫巧”,或者说是“巫术”,对于某些特定场景是非常关键的。 从某种角度而言,我们可以直接称之为“缺陷”;“让语言的使用者无需关心底层实现”是编程语言发展的重要方向之一。“程序语义简单直观”也是 JSR 133 的目标之一。如,JDK CopyOnWriteArrayList.set() 方法中对 volatile 字段的处理方式就涉及了非常晦涩的内存模型特性。(详情)
原文:《JSR 133 (Java Memory Model) FAQ》
Jeremy Manson and Brian Goetz,2004年2月
目录:
什么是内存模型(M ...
三大并发类:Concurrent、CopyOnWrite、Blocking
Java并发包中的集合从线程安全实现方式而言可分为三类:Concurrent、CopyOnWrite、Blocking。
Concurrent 类的集合基于 lock-free 的方式实现。严格来说,它们是真正的并发。适合实现较高的吞吐量。
CopyOnWrite 类的集合顾名思义,会在该变集合的操作中拷贝原数据,并用新的内部集合对象替换原内部对象。
Blocking 类的集合则通过锁(ReentrantLock)实现。它们会提供 “等待性” 的方法。
Concurrent 的代价
虽然 Co ...
我们说的 Filter 和 Interceptor 是啥?
Filter:javax.servlet.Filter
Interceptor:org.springframework.web.servlet.HandlerInterceptor
参考:
《Filter vs Interceptor》
《Difference between Interceptor and Filter in Spring MVC》
简介
Filter
public interface Filter {
public void init(FilterConfig fi ...
命令行进度条的实现原理和示例
- 博客分类:
- Tip
原理简述
对于通常的命令行输出,大部分人的印象都是一行一行递增的模式。而进度条需要每次内容更新都在同一行,容易让人觉得很“神奇”。一些问答网站上,如 StackOverflow,就有人问“某某语言如何实现命令行进度条 ...
这里只提供最常用的Dubbo服务调优点简要说明,旨在用更小的成本,获得更多性能收益。 这里的“成本”是综合性的,包括 时间、硬件、技术学习等。即,此指南追求“实用性”。“最常用”、“简要”也意味着这不是一份全 ...
Spring i18n 国际化样例
- 博客分类:
- Java
网上有很多Spring国际化的样例,但是缺少详细的样例。特别是国外网上很多是Spring MVC(Web)之类的样例,而国内稍具规模的软件开发组织都采用前后端分离的模式,所以几乎很少有易于模仿的 纯基础Spring国际化 样例。
1. 创建 Spring Boot 工程
1.1 Maven依赖
此示例以Command Line方式运行,所以依赖 spring-boot-starter,而不是 spring-boot-starter-web。 本人非常讨厌 Spring官网那种 “直接” “仅” 提供Web服务样例的入门示例! 我觉得入门就该从最简单基础的模式开始,“直接从Web ...
Java并发包中有很多可以实现同步的结构。以下几种就属于典型的“非显式”锁:
Semaphore:Java版本的信号量实现。
CountDownLatch:允许一个或多个线程等待某些操作完成。
CyclicBarrier:允许多个线程等待达到某个屏障。
Phaser:分阶段地等待多个线程达到某个屏障。
CountDownLatch vs CyclicBarrier
CountDownLatch 和 CyclicBarrier 都可用于等待多个线程完成相关操作(达到某个同步点)。 CountDownLatch 侧重于 让一个线程等待其它多个线程执行完成任务。 CyclicB ...
【Java核心-进阶】线程——排查死锁、避免死锁
- 博客分类:
- Java
1. 线程死锁的原因
死锁:两个或多个线程之间,由于互相持有对方需要的锁,而永久出于阻塞的状态。
会引起死锁的代码示例:
public static void main(String[] args) throws InterruptedException {
String lockA = "lock-A";
String ...
【Java核心-进阶】线程
- 博客分类:
- Java
一个最简单的HelloWorld程序,背后也有多个线程。
public static void main(String[] args) {
System.out.println("Hello World");
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadMXBean.getAllThreadIds();
ThreadInfo[] thre ...
Java单例模式就该这么写
- 博客分类:
- Java
Java的单例模式实现方式一直是各路“大神”讨论的重点。 人们往往会去关注是否线程安全,是否支持懒加载,以前老版本Java的双检锁问题,volatile happen-before 问题,学究式的枚举类式实现。 我们真的需要了解这么多细节吗? ...
【Java核心-基础】接口 和 抽象类
- 博客分类:
- Java
Java单继承的局限
与C++ Python之类语言不同,Java 不支持多继承。即,一个类不能同时直接继承多个父类。而接口(interface)是抽象方法的集合,是声明性的。所以当需要重用某些处理逻辑时,由静态方法组成的工具类(Utils) ...
简述
Java NIO 中提供了 DirectBuffer、MappedByteBuffer 以提高IO效率。
DirectBuffer
DirectBuffer 占用的是 堆外内存。JVM 会在 DirectBuffer 上直接使用 “本地IO操作”(Native I/O Operations)。 Buffer 的地址对“本地IO操作”非常关键。所以 ...