多线程与高并发
文章平均质量分 89
多线程与高并发
雨下一整碗儿
进修中的小码农
展开
-
ConcurrentHashMap
ConcurrentHashMap实现原理及使用为什么要使用ConcurrentHashMap?ConcurrentHashMap是线程安全且高效的HashMap。我们知道HashMap在多线程场景下可能会导致死循环(1.7)。而使用线程安全的HashTable效率又非常低下(全是synchronized方法)。JDK1.6中的ConcurrentHashMap**JDK1.6中ConcurrentHashMap采用了分段锁(segment)的形式,即每一把锁用于锁容器中的一部分数据,那么多线程访问原创 2021-06-06 17:36:24 · 293 阅读 · 0 评论 -
15-ThreadLocal
线程本地变量——ThreadLocalThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。可以通过set(T)方法来设置一个值,在当前线程下再通过get()方法获取到原先设置的值。ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,多线程环境下可以有效防止自己的变量被其他线程篡改。Thr原创 2021-05-31 21:31:01 · 68 阅读 · 0 评论 -
ReentrantReadWriteLock-读写锁
读写锁读写锁的概念之前提到锁,基本都是排他锁(如ReentrantLock)。这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性比一般的排它锁有了很大提升。除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的用作缓存数据结构,它大部分时间提供读服务(例如查询和搜索),而写操作占有的时间很原创 2021-05-28 13:20:06 · 205 阅读 · 0 评论 -
ReentrantLock重入锁解析
ReentrantLock从之前的环节我们了解到,synchronized和ReentrantLock都是可重入锁,但是ReentrantLock不像synchronized那样是隐式的重入锁,而是在调用lock()方法时,不阻塞已经获取到锁的线程。ReentrantLock为我们实现了公平锁和非公平锁,同时支持重入。ReentrantLock的重入性重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题:线程再次获取锁。锁需要去识别获取锁的线程是否为当前原创 2021-05-26 13:08:40 · 177 阅读 · 0 评论 -
抽象队列同步器-AQS
抽象队列同步器——AQS介绍AQS(AbstractQueuedSynchronizer),是用来构建锁或者其他同步组建的基础框架,他使用了一个int成员变量(waitStatus)表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。子类通过继承AQS这个同步器并实现它的抽象方法来管理同步状态,它既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,也是ReentrantLock,CountDownLatch等同步工具实现的基础。CLH lock queueAQS其实是一个原创 2021-05-20 13:13:07 · 278 阅读 · 0 评论 -
volatile关键字解析
Volatile关键字解析volatile是轻量级的synchronized,它在多线程开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程的上下文切换和调度。volatile的定义与实现原理Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通原创 2021-05-17 13:05:03 · 78 阅读 · 0 评论 -
Unsafe源码解析
Unsafe介绍: Java无法直接访问底层操作系统,而是通过本地方法(native)来访问。Java中的Unsafe类为我们提供了管理内存的能力。创建Unsafe对象Unsafe类是final的,不允许继承,而且构造函数是final的,无法通过new的方式创建对象:public final class Unsafe { // 构造函数私有 private Unsafe() {} ...}但是我们可以通过反射的方式获取Unsafe对象:static void t原创 2021-05-06 13:33:43 · 403 阅读 · 0 评论 -
synchronized关键字解析
synchronized 关键字实现原理介绍synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下三种形式:对于普通同步方法,锁是当前实例对象:对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是synchronized括号里配置的对象// 普通的synchronized方法public synchronized String getName() { return "张三";}// 静态同步方法public synchronized原创 2021-05-13 13:22:43 · 82 阅读 · 0 评论 -
线程与协程
Java中的线程Java线程如何实现以HotSpot为例,它的每一个Java线程都是直接映射到一个操作系统的原生线程来实现的,而且中间没有额外的简介结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间,该把线程安排给哪个核心处理器去执行等,都是由操作系统完成的,也都是由操作系统全权决定的。Java线程调度线程的调度方式有两种:协同式线程调度和抢占式调度。协同式的好处:实现简单,原创 2021-05-11 12:23:26 · 82 阅读 · 0 评论 -
先行发生原则-Happends-Before
先行发生原则——Happens-Before先行发生原则是判断数据是否存在竞争,线程是否安全的有效手段。先行发生是Java内存模型中定义的两项操作之间的偏序关系,比如说操作A先行发生于操作B,其实就是说发生在B之前,操作A产生的影响能被B观察到,“影响”包括修改了内存中共享变量的值,发送了消息,调用了方法的等。以下举例说明:// 以下操作在线程A中执行i = 1;// 以下操作在线程B中执行j = i;// 以下操作在线程C中执行i = 2;假设线程A中的操作“i=1”先行发生于线程B的操原创 2021-05-08 08:37:06 · 717 阅读 · 0 评论 -
JMM——Java内存模型
JMM——Java内存模型概述在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的计算能力强大了,还有一个重要的原因是:计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O,网络通信或者数据库访问上。如果不希望处理器在大部分时间都处于等待其他资源的空闲状态,就必须使用一些手段把处理器的运算能力"压榨"出来,否则就会造成很大的性能浪费,而让计算机同时处理几项任务是最容易想到,也最有效的“压榨”手段。**每秒事务处理数(Transactions Per Second,原创 2021-05-07 12:56:19 · 125 阅读 · 0 评论