线程池原理

ThreadPoolExecute 使用示例 public class User { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(2,10,60, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10)); for(int i =0 ;i < 20; i ++){ executor.execute(new Task(i)); } executor.shutdown(); } } class Task implements Runnable { int i; public Task(int i ) { this.i = i; } @Override public void run() { System.out.println(new Date() + ":"+ i + ":" + Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } 先使用构造方法生成一个线程池对象,然后使用 execute

线程池的应用与原理

java 中的线程 线程是调度 CPU 资源的最小单位,线程模型分为 KLT 模型与 ULT 模型,JVM 使用的 KLT 模 型,Java 线程与 OS 线程保持 1:1 的映射关系,也就是说有一个 java 线程也会在操作系统里有一个对应的线程。 Java 线程有多种生命状态 :

ArrayList和CopyOnWriteArrayList

ArrayList ArrayList 的保护机制 for(String str : list){ if(str.equals("123")){ list.remove(str); //抛出异常 } } 这里的 foreach 语法糖实际上调用了 ArrayList 的迭代器类。如下: 如果在开始迭代的时候数组中有 5 个元素,但是在迭代中移除了一个元素,数组实际上还有 4 个元素,但是还是会遍历第五个元

ConcurrentHashMap与HashTable

HashTable 是什么? 之前详细介绍过 HashMap 的原理,HashTable 与 HashMap 用法一样,都是 key-value 结构,底层的实现都差不多,最大的区别是, HashTable 是线程安全的,HashMap 不是线程安全的。 为什么需要线程安全? 我们知道,HashMa

HashMap底层原理

在 JDK 1.8 版本之前,HashMap 底层的数据结构是数组 + 链表,如下图: 在 1.8 及以后是数组 + 链表 + 红黑树 重要的几个变量 DEFAULT_INITIAL_CAPACITY = 1 « 4; Hash 表默认初始容量 MAXIMUM_CAPACITY = 1 « 30; 最大 Hash 表容量 DEFAULT_LOAD_FACTOR = 0.75f;默认加载因子 TREEIFY_THRESHOLD = 8;链表转

并发编程之Atomic和Unsafe魔法类

原子操作 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂 处理器会保证基本内

并发编程之Semaphore和CountDownLatch的用法

Semaphore Semaphore 是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。 可以理解为许可证,或者令牌。线程想要访问某部分资源时,必须先获取一个许可证,才能

并发编程AQS原理

JDK1.5以前只有synchronized同步锁,并且效率非常低,大神Doug Lea自己写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能

yml配置文件读取

import ( "fmt" "github.com/spf13/viper" "os" "path/filepath" ) type Config struct { DesDir string SourceFiles []string } func loadConfig()(con Config){ home := os.Getenv("HOME") viper.SetConfigFile(filepath.Join(home,"config","syncFile.yml")) viper.SetConfigType("yml") err := viper.ReadInConfig() checkErr(err) err = viper.Unmarshal(&con) checkErr(err) fmt.Printf("config: %v\n", con) return con } func checkErr(err error){ if err != nil { panic(err) } }

GC日志详解

对于 java 应用我们可以通过一些配置把程序运行过程中的 gc 日志全部打印出来,然后分析 gc 日志得到关键性指标,分析 GC 原因,调优 JVM 参数: 开启 GC 日志相关参数 java -jar ‐Xloggc:./gc‐%t.log ‐XX:+Prin

java常量池

Class常量池 Class常量池可以理解为class文件中的资源仓库,class 文件中除了包含类信息,方法,字段,接口信息之外还有常量池信息,用于存放编译期生成的各种字面量和符号引用。 如下: 常量池主要

JVM调优工具

jps 查看启动的 java 进程 jmap 实例个数与内存占用 看内存信息,实例个数以及占用内存大小 [C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] 堆信息 jump -heap 17680 导出堆内存占用信

G1垃圾收集器

G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对多颗处理器及大容量内存的机器,具备极短的 GC 停顿时间和高吞吐量的特征. G1 堆内存划分 G1 不像 CMS 那样,老年代和年轻代不再有明显的区分。而是将内存分为很多和区域(Reg