并发
文章平均质量分 92
skier~
Java 偏执狂
展开
-
Java 线程池
一、线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。 我们这里所说的线程池是指DK中提供的ThreadPoolExecutor类。 使用线程池的好处:原创 2021-11-27 07:38:40 · 99 阅读 · 0 评论 -
volatile底层原理
1、常见面试题 volatile关键字的作用是什么? volatile能保证原子性吗? 之前32位机器上共享的long和double变量的为什么要用volatile? i++为什么不能保证原子性? volatile是如何实现可见性的? volatile是如何实现有序性的? 2、volatile的作用 1、volatile保证可见性 Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排它锁单独获得这个变量。Java 语言提供了 volatile,在某些情况下比锁原创 2021-11-27 07:38:04 · 218 阅读 · 0 评论 -
synchronized底层原理
一、常见面试题 什么是锁的升级和降级 什么是JVM里的偏向锁、轻量级锁、重量级锁 不同JDK里的Synchronized的实现 二、Synchronized的使用 代码块形式: // 这个括号中的对象可以是this,也可以是自定义的 Object // 还可以是这个类的class对象, 类.class synchronized (this) { // 同步代码块 } 方法形式: // 锁对象默认是this public synchronize原创 2021-11-27 07:37:29 · 57 阅读 · 0 评论 -
Java并发之JMM
JMM 内存模型 为什么需要内存模型? 我们知道 CPU 的运算速度是很快的,与内存也有几个数量级上的差距,所以一般现代计算机系统都会在内存与 CPU 之间加入一层或多层读写速度尽可能接近 CPU 运算速度的高速缓存来作为缓冲。 将运算需要使用的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。 为此,这不可避免的带来了一个新的问题:缓存一致性(Cache Coherence)。 就是说当多个 CPU 的运算任务都涉及同一块主内存区域时,将可能导致原创 2021-11-26 22:46:18 · 288 阅读 · 0 评论 -
happens-before
为什么要有 happens-before happe-before 是 JMM 最核心的概念,对应 Java 程序员来说,理解 happens-before 是理解 JMM 的关键。 从 JMM 设计者的角度来看,可见性和有序性其实是互相矛盾的两点: 一方面,对于程序员来说,我们希望内存模型易于理解、易于编程,为此 JMM 的设计者要为程序员提供足够强的内存可见性保证,专业术语称之为 “强内存模型”。 而另一方面,编译器和处理器则希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化(比原创 2021-11-26 22:44:44 · 295 阅读 · 0 评论 -
ConcurrentHashMap杂谈
为什么使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环,而使用线程安全的HashTable效率又非常低下 线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100% 死循环案例: final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = new Thread(new Runn原创 2020-12-26 22:45:05 · 5576 阅读 · 11 评论