
Java基础
yakax
这个作者很懒,什么都没留下…
展开
-
LongAdder源码学习
LongAdder 更适合做全局计数统计。而AtomicLong适合做自增,因为他能累加并实时返回值,而LongAdder统计的值时近实时。AtomicLong 由于一直通过cas自旋修改值,在高并发情况下会有很多线程处于自旋,而LongAdder 利用空间换时间的方式把要增加的值先放另一边。原创 2020-09-29 14:51:56 · 116 阅读 · 0 评论 -
HashMap 常见问题Java8(扩容、转红黑树、退化链表、Hash优化)
HashMap扩容HashMapHashMap树化HashMap退化链表HashMap hash优化HashMap put过程HashMap 转红黑树条件HashMap 循环异常 ConcurrentModificationException红黑树、链表原创 2020-09-05 17:18:45 · 11214 阅读 · 10 评论 -
并发编程学习(6)CountDownLatch、Semaphore、CyclicBarrier
CountDownLatchcountdownlatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行,countdownlatch 提供了两个方法,一个是 countDown,一个是 await。countdownlatch 初始化的时候需要传入一个整数,在这个整数倒数到 0 之前,调用了 await 方法的程序都必须要等待,然后通过 countDown 来...原创 2020-02-19 21:44:03 · 217 阅读 · 0 评论 -
并发编程学习(5)Condition
Condition在前面学习 synchronized 的时候,有wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面应该也有提供线程通信的机制,Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。测试代...原创 2020-02-19 21:41:16 · 313 阅读 · 0 评论 -
并发编程学习(4)Lock
初步认识JUCJava.util.concurrent 是在并发编程中比较常用的工具类,里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。lock在 Lock 接口出现之前,Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场...原创 2020-02-19 21:38:56 · 390 阅读 · 0 评论 -
并发编程学习(3)线程安全性分析
初步认识 Volatile public /*volatile*/ static boolean stop=false; public static void main( String[] args ) throws InterruptedException { Thread t1=new Thread(()->{ int i=0; ...原创 2020-02-19 21:36:00 · 202 阅读 · 0 评论 -
并发编程学习(2)synchronized与锁的唤醒
synchronized 的基本认识在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对synchronized 进行了各种优化之后,有些情况下它就并不那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。synchronized 的基本语法synchronized 有三种...原创 2020-02-19 21:31:04 · 1853 阅读 · 0 评论 -
并发编程学习(1)线程的创建、启动、停止
单核cpu执行程序的流程有了进程以后,可以让操作系统从宏观层面实现多应用并发。而并发的实现是通过 CPU 时间片不端切换执行的。对于单核 CPU 来说,在任意一个时刻只会有一个进程在被CPU 调度线程的出现在多核 CPU 中,利用多线程可以实现真正意义上的并行执行在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞。通过对不同任务创...原创 2020-02-19 21:21:56 · 331 阅读 · 0 评论 -
LinkedList真的是查找慢增删快吗
以前别人面试我,这个问题的时候我一般都是回答:linkendlist增删改块,arraylist查找块。直到最近我看了掘金的一篇博文,才发现,实践出真知啊。测试结果分别在ArrayList和LinkedList的头部、尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果List插入查找ArrayList头部2859ms7ms...转载 2020-02-19 20:59:42 · 438 阅读 · 0 评论 -
Java开发手册-(转自阿里云栖社区)
Java开发手册下载链接1-0.9=0.1是天经地义的,但在计算机的世界里,0.1恰恰是无法精确表示的一个小数,只有2的幂次倍小数才能够精确表示,如:0.5、0.25、0.125等。由于0.1是近似表达,在各种情形中的计算存在数位的取舍精度不一样,所以1-0.9未必等于0.9-0.8,所以浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。包装类型运算也是调...原创 2020-02-19 20:57:18 · 310 阅读 · 0 评论