Java高并发
学习Java高并发的笔记
loser与你
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap实现原理
ConcurrentHashMap实现原理1.HashMap实现原理 HashMap是线程不安全的。HashMap是由数组+链表实现的,当无冲突发生时是在数组中存放,当发生hash冲突时在该位置下面挂链表,链表越长代表冲突越多。在多线程情况下,在put的时候,插入的元素超过了容量就会触发扩容操作,即rehash,此时将该hash表中的元素重新hash到另一个更大容量的hash表,在多线程环境下,存在同时其他元素也在进行put操作,如果hash值相同,可能在同一链表下出现闭环,从而导致出现死循环。2.H原创 2021-09-03 10:50:46 · 2090 阅读 · 0 评论 -
CAS机制
CAS机制 CAS机制是一种无锁策略,使用比较交换的技术来鉴别线程冲突,一旦检测到冲突产生,就重试当前操作直到没有冲突为止。1.CAS算法过程: CAS(V, E, N)包含三个参数,V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,说明已经有其他线程做了更新,当前线程什么也不用做。最后,CAS返回当前V的真实值。 也就是,当前线程要去修改V的时候它看见的V值为E,若在进行修改的时候它还是E说明没有线程修改V,则它可以放心地将V修改为N。若是等原创 2021-09-03 10:39:19 · 752 阅读 · 0 评论 -
volatile和synchronized有什么区别
volatile和synchronized有什么区别1.工作原理 · volatile本质上是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取。 · synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住2.使用级别 · volatile仅能使用在变量级别 · synchronized可以使用在变量、方法和类级别3.可见性和原子性 · volatile仅能实现变量的可见性,不能保证原子性 · synchronized可以保证变量的可原创 2021-09-03 10:26:11 · 122 阅读 · 0 评论 -
ReenTrantLock和synchronized有什么区别
ReenTrantLock和synchronized有什么区别1.使用区别 Lock是一个接口,而synchronized是关键字,是内置的语言实现。 Synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁现象。Lock发生异常时,若没有主动释放,极有可能造成死锁,故需要在finally中调用unlock()方法释放锁。 通过Lock可以知道有没有成功获得锁,而synchronized就不可以了. Lock有着显式的操作过程,开发人员必须手动指定何时加锁,何时释放锁,因而重入锁原创 2021-09-03 10:18:42 · 1492 阅读 · 0 评论 -
Java中的锁
Java中的锁1.悲观锁 总是假设最坏的情况,每次取数据都认为其他线程会修改,所以都会加锁,当其他线程想要访问数据时,都需要阻塞挂起。 使用synchronized来实现。2.乐观锁 总是认为不会产生并发问题,每次取数据时都认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改. 使用CAS机制。3.偏向锁(偏向锁->轻量级锁->重量级锁->自旋锁) 偏向于第一个访问锁的线程,如果在线程运行过程中,同步锁只有一个线程访问,不存原创 2021-09-03 10:14:35 · 53 阅读 · 0 评论 -
Java线程同步的几种方式
Java线程同步的几种方式1.使用synchronized关键字 它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性。 synchronized关键字的用法:(1)同步方法 即有synchronized修饰的方法,由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。代码如:public synchronized void save(){}。 synchronized也可以修饰静原创 2021-09-02 16:25:13 · 2047 阅读 · 0 评论 -
线程基本操作
线程基本操作1.线程创建添加链接描述2.线程终止 Thread.stop()方法,是一个被标注为废弃的方法,原因是stop()方法过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题。stop()方法在结束线程时,会直接终止线程,并立即释放这个线程所持有的锁,而这些锁是用来维持对象一致性的。3.线程中断 线程中断并不会使线程立即退出,而是给线程发送一个通知,告诉目标线程,有人希望你退出了,至于目标线程接到通知后如何处理,则完全由目标线程自行决定。 有三个方法与线程中断有关:原创 2021-09-02 16:15:27 · 151 阅读 · 0 评论 -
Java创建线程的几种方式
Java创建线程的几种方式 新建线程只需要使用new关键字创建一个线程对象,并且将它start()起来即可。1.继承Thread类 继承Thread类,重写run()方法即可2.实现Runnable接口(优先使用这种方法) 实现Runnable接口,重写run()方法,然后借助Thread的start()方法开启线程。要注意的是,没有start(),直接调用run()方法,只是作为一个普通的方法调用,并不能新建一个线程。 Runnable接口是一个只有run()方法的单方法接口,Thread类原创 2021-09-02 16:09:23 · 164 阅读 · 0 评论 -
并发级别有哪些
并发级别有哪些 1.阻塞:一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当使用synchronized关键字或者重入锁时,得到的就是阻塞的线程。阻塞的控制方式是悲观策略,系统认为两个线程之间很有可能发生不幸的冲突,以保护共享数据为第一优先级。 2.无饥饿:公平锁可以保证无饥饿 3.无障碍:最弱的非阻塞调度,两个线程如果无障碍地执行,那么不会因为临界区的问题导致一方被挂起。无障碍的调度是一种乐观的策略,系统认为多个线程之间很有可能不会发生冲突,大家都应该无障碍地执行,但是一旦检测到原创 2021-09-02 16:02:57 · 279 阅读 · 0 评论 -
Java线程的状态有哪些
Java线程的状态有哪些 1.NEW(新建状态):线程创建之后 2.RUNNABLE(可运行):可能正在运行,也可能在等待CPU时间片 3.BLOCKED(阻塞):暂停执行,直到获得请求的锁 4.WAITING(无期限等待):等待其他线程显式地唤醒,否则不会被分配CPU时间片 5.TIMED_WAITING(有时限等待):等待到其他线程唤醒,若时间到了还未被其他线程唤醒,则会被系统自动唤醒 6.TERMINATED(终止):可以是线程结束任务之后自己结束,也可以是产生了异常而结束...原创 2021-09-02 16:01:23 · 51 阅读 · 0 评论 -
happen-before原则是什么
happen-before原则是什么 1.程序顺序原则:一个线程内保证语义的串行性 2.volatile规则:volatile变量的写先于读发生 3.锁规则:解锁必然发生在随后的加锁前 4.传递性:A先于B,B先于C,那么A必然先于C 5.线程的start()方法先于它的每一个动作 6.线程的所有操作先于线程的终结(Thread.join()) 7.线程的中断(interrupt())先于被中断线程的代码 8.对象的构造函数的执行、结束先于finalize()方法...原创 2021-09-02 15:59:21 · 69 阅读 · 0 评论 -
Java内存模型中的可见性、原子性和有序性
Java内存模型中的可见性、原子性和有序性 1.原子性:指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。(用锁来保证原子性) 2.可见性:指当一个线程修改了某一个共享变量的值时,其他线程是否能够立即知道这个修改。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值,这种依赖主内存作为传递媒介的方法来实现可见性的。(重点是volatile) 3.有序性:程序在执行时,可能会进行指令重排,重排后的指令与原指令的顺序未必一致。对原创 2021-09-02 15:57:36 · 131 阅读 · 0 评论 -
Java内存模型
Java内存模型 Java内存模型(Java Memory Model)JMM主要是为了规定线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存,Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主内存完成。 关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存子类的细节实现,JMM原创 2021-09-02 15:55:34 · 67 阅读 · 0 评论