1 常用线程安全类型* 1.1 JDK 基础数据类型与集合类 1.2 ArrayList 基本特点:基于数组,便于使用 index 随机访问,超过数组容量时需要扩容,扩容成本较高。 用途:大部分情况下操作一组数据都可以用 ArrayList。 原理:使用数组模拟列表,默认大小10,扩容x1.5,newCapacity = oldCapacity + (oldCapacity >> 1)。 安全问题… 阅读全文
分类: 编程开发
多线程与并发编程 (2/3)
1 Java并发包(JUC) 1.1 JDK 核心库的包 其中,Java 的并发工具类定义在 java.util.concurrency 包中。 1.2 java.util.concurrency JUC 包中主要包括一下几种类: **锁机制类Locks : **Lock, Condition, ReentrantLock, ReadWriteLock,LockSupport **原子操作类Ato… 阅读全文
多线程与并发编程 (1/3)
1 多线程基础 1.1 为什么会有多线程 本质原因是摩尔定律失效,CPU 的单核性能没有办法快速提高,从而导致多核+分布式的时代的来临。 多 CPU 核心意味着操作系统有了更多的并行计算资源可以使用。操作系统以线程作为基本的调度单元。单线程是最好处理的。线程越多,管理复杂度越高,跟我们程序员都喜欢自己单干是一个道理。《人月神话》里说加人可能干得更慢,可见多核时代的编程更有挑战。 1.2 Java … 阅读全文
五种 IO 模型
1 单线程、任意创建线程与线程池的对比 分别使用单线程、任意创建线程的多线程以及线程池的方式实现一个简单的 HTTP Server,使用 Super Benchmark 对其进行压力测试。 单线程 任意创建线程 使用固定大小的线程池 2 NIO 模型与相关概念 通信模型 阻塞、非阻塞:可以理解为做一件事情能否立即得到返回结果,能立即得到就是非阻塞,不能立即得到就是阻塞。 同步、异步:完成一系列任务… 阅读全文
JVM 核心技术 —— 调优分析
JVM 核心技术 —— 调优分析 1. GC 日志解读与分析 * 任务: 1)模拟一下OOM (测试使用的 GCLogAnalysis.class 是一个字节码文件,该文件在5秒内持续创建对象,并随机地将一些对象缓存起来,这部分对象无法被 GC 回收) 2)分别使用512m,1024m/1g,2048m/2g,4096m/4g,观察 GC 信息的不同 1.1 Paralle… 阅读全文
JVM 核心技术 —— 工具与 GC 策略
JVM 核心技术 —— 工具与 GC 策略 1 JDK 内置命令行工具 jps -l 查看所有 Java 进程的进程号 jps -mlv 加上mlv参数之后可以打印更详细的信息(JVM 启动参数) jinfo 进程号 打印 JVM 的配置信息 PS C:\Windows\system32> jinfo 8444 Attaching to process ID 8444, please wai… 阅读全文
LeetCode-1 Two Sum 解析
题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: [go]给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1][/go… 阅读全文
Go内建容器之映射(map)
映射是一种数据结构,用于存储一系列无序的键值对。 注: 1.map内部使用Hash表 2.除了slice,map,function的内建类型都可以作为map的key 3.struct类型不包含上述字段,也可作为key 创建和初始化 使用make声明map [go]m := make(map[string]int) //创建一个map,key的类型为string,value的类型为int[/go] … 阅读全文
Go内建容器之切片(slice)
切片(slice)是一种数据结构,这种数据结构便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数append来实现的,这个函数可以快速且高效地增长切片。还可以通过对切片的再次切片来缩小一个切片的大小。因为切片的底层内存也是在连续块中分配的,所以切片还能获得索引、迭代、及为垃圾回收优化的好处。 slice的创建和初始化 1.通过数组创建 [g… 阅读全文
Go内建容器之数组
数组的声明 [go]var arr1 [5]int arr2 := [3]int{1, 3, 5} arr3 := […]int{2, 4, 6, 8, 10} var xy [3][4]bool //三行四列的二维数组[/go] 数组的遍历 [go]func traverse(arr *[5]int) { for i, v := range arr { //i为元素… 阅读全文