![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java并发
Java并发编程
DO your like
冇七年
展开
-
字段更新器
原创 2023-03-27 15:23:13 · 415 阅读 · 0 评论 -
ThreadLocal
ThreadLocal对于每一位Java读者而言我想可能都不陌生,因为面试基本都会被问到。ThreadLocalJDK1.2的版本中就提供java.lang.ThreadLocal类,每一个ThreadLocal能够放一个线程级别的变量, 它本身能够被多个线程共享使用,并且又能够达到线程安全的目的,且绝对线程安全。ThreadLocal包含了四个方法:void set(Object value)设置当前线程的线程局部变量的值。public Object get()该方法返回当前线.转载 2022-05-07 11:40:32 · 319 阅读 · 0 评论 -
共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改、读脏数据
共享锁(S锁)又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。获准共享锁的事务只能读数据,不能修改数据。 共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享.排它锁(X锁)又称为写锁、独占锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A互斥锁在编程中,引入了对象转载 2021-12-10 23:24:47 · 260 阅读 · 0 评论 -
并发工具——内容介绍
Java并发工具:线程池JUC第三方并发工具(disruptor、guava)原创 2021-03-19 12:31:41 · 99 阅读 · 0 评论 -
原子数组
原创 2021-03-13 12:43:01 · 124 阅读 · 0 评论 -
AtomicMarkableReference
原创 2021-03-12 13:02:47 · 267 阅读 · 0 评论 -
AtomicStampedReference——ABA问题
原子引用无法判断过程中有没有被修改过,只能判断共享变量的值有没有改变,虽然对业务无影响,但却是一种隐患,为了解决这种问题,可以加入一个版本号,每一次原子变量做操作,版本号自增一次,代码如下:...原创 2021-03-12 12:46:00 · 98 阅读 · 0 评论 -
CAS_JRE提供的相关原子性类
s原创 2021-03-12 12:23:19 · 114 阅读 · 0 评论 -
CAS的实现
import java.util.concurrent.atomic.AtomicInteger;【注意:】cas的实现通过compareAndSet(prev,next)是通过给变量添加volatile来实现的,这是因为volatile可以实现变量的可见性原创 2021-03-09 12:36:41 · 101 阅读 · 0 评论 -
JMM——Java内存模型简介
【注:】上图主存指的是所有线程共享的数据,比如公共静态成员变量、公共成员变量,而工作内存是线程自己私有的数据原创 2021-02-25 12:26:28 · 184 阅读 · 0 评论 -
ReentrantLock
相对于synchronized具备以下特点:可中断 可设置超时时间 可设置为公平锁 支持多个条件变量 与synchronize一样,都支持重入语法:reentrantLock.lock()try { //临界区} finally { //释放锁 reentrantLock.unlock();}可重入:是指同一个线程如果哦首次获得了这把锁,那么以为他是这把锁的拥有者,因此有权利再次获得这把锁.........原创 2021-02-22 12:59:29 · 129 阅读 · 0 评论 -
Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、锁粗化3、锁消除一、Synchronized使用场景Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二是多线程同时访问并改变该数据。例如:public class AccountingSync imple原创 2021-02-02 08:23:29 · 239 阅读 · 0 评论 -
13-锁膨胀
当Thread-0退出同步块解锁时,使用cas将Mark Word的值恢复给对象头,失败。这时会进入重量级解锁流程,即按照Monitor地址找到Monitor对象,设置Owner为null,唤醒EntryList种的BLOCKED线程原创 2020-11-17 14:26:27 · 104 阅读 · 0 评论 -
12-轻量锁加锁和解锁
如果对象头的mark word已经被另一个线程改过了,状态变成了00(轻量锁)那么就加锁失败失败的情况:一种是上面提到的情况,已经被其它线程抢先一步,另一种是锁重入,如下图:原创 2020-11-17 13:42:50 · 266 阅读 · 0 评论 -
11-Monitor
首先先了解下对象的内容结构Mark Word的存储内容会随着不同的状态而变化原创 2020-11-17 13:21:32 · 301 阅读 · 0 评论 -
10-不推荐的方法
static:stop() 停止线程运行 容易致使线程死锁suspend() 挂起线程resume() 恢复线程运行原创 2020-11-16 14:01:07 · 69 阅读 · 0 评论 -
09-日常的线程安全分析
引言:不讨论业务场景是否合理,只针对线程安全做分析情况1:如果多个线程对一个全局变量做操作,会引起线程安全问题——解决方法:每个线程设置一个自己的局部变量情况2:情况1已经解决了线程不安全,但是有种情况要注意——继承。如果一个线程执行了一个类FatherClass的方法method1,另一个线程执行了该类的子类SubClass的method1,恰巧SubClass重写了FatherClass的这个method1,那就有可能出异常,如下图,重写的方法中开了新线程,相当于新线程在局部变量的作用域内——解原创 2021-01-26 15:44:04 · 109 阅读 · 1 评论 -
09-Java可变类和不可变类
java可变类和不可变类可变类 获取到这个类的实例后,可以改变这个实例内容,比如改变这个实例的内在成员变量。 不可变类(Integer、String...) 获取到类的实例后,不可以改变这个实例的内容,不可变实例一旦创建,其内在成员变量的值便不可再变。 不可变类典型的像String,String对象一经创建便不可再变,我们在前台改变String对象的值,其实在内存中是新创建了一个String对象,而原来的对象保持不变。 而StringBuild则是可变类,因为每次对于它的对象的修改都作原创 2021-01-26 15:59:57 · 773 阅读 · 1 评论 -
09-park线程终止模式
LockSupport.park()import java.util.concurrent.locks.LockSupport;import static java.lang.Thread.currentThread;public class InterruptDemo02_park { public static void park() throws InterruptedException { Thread t1 = new Thread(()->{原创 2021-01-22 17:13:55 · 437 阅读 · 2 评论 -
09-两阶段线程终止模式
终止线程的方式:stop:直接杀死进程,连锁都不释放,已被弃用System.exit():停止线程,相当于整个程序终止运行interrupt:推荐搭配下面的两阶段终止模式来优雅停止线程两阶段终止示意图:注:isInterrupted():执行后不会清楚标记,但是还有一个interrupted()方法,执行后自动清除标记public class Test3{TwoPhaseTermination tpt = new TwoPhaseTermination();tp.原创 2020-11-16 13:58:00 · 200 阅读 · 0 评论 -
08-Thread常用的方法
sleep调用sleep会让当前线程从 running进入Timed Waitting状态 其他线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException 睡眠结束后的线程未必会立即执行 建议用TimeUnit的sleep代替Thread的sleep来获取更好的可读性yield调用yield会让当前线程从running进入到runnable态,然后调度执行其他同优先级的线程。如果这时候没有同优先级的线程,那么不能保证当前线...原创 2021-01-19 16:25:12 · 90 阅读 · 0 评论 -
08-常见的Thread安全类
StringIntegerStringBufferRandomVectorHashtablejava.util.concurrent包下的类这里说明他们是线程安全的是指:多个线程调用他们同一个实例的某个方法时,是线程安全的,也可以理解为1、它们的每个方法是原子的2、但注意它们多个方法的组合不是原子的,见后面分析...原创 2021-01-26 12:01:24 · 88 阅读 · 0 评论 -
07-Java的线程状态
下面以五阶段状态图作解释:New——初始状态:线程对象创建成功,但是并没有执行start()方法 Runnable——就绪态/可运行态:执行了start()方法,创建了新线程 Running——运行状态:线程得到了CPU的执行权,开始执行 Dead——消亡状态:线程执行结束 Block——阻塞状态 Blocked:执行的时候遇到了锁,而且自己没有得到锁,那没办法了只能把自己挂起来 Waitting:执行的时候自己通过 wait() 释放了锁,陷入了无限的阻塞态,除非有notify()、原创 2021-01-19 16:22:19 · 106 阅读 · 0 评论 -
06-上下文切换
概念因为以下原因导致cpu不再执行当前线程,转而执行另一个线程代码被动式上下文切换: 线程的cpu时间片用完了,时间片一般就是10~15ms 垃圾回收器 其它优先级高于当前执行线程的线程。(这种叫中断上下文切换,推荐一个专业的上下文讲解文章:https://blog.csdn.net/qq_36777191/article/details/112604108) 主动式上下文切换: 线程自己调用 sleep 线程自己调用 yield 线程自己调用 wait 线程自己调..原创 2021-01-19 13:10:51 · 161 阅读 · 0 评论 -
05-线程栈帧的执行示意图
当最后一个栈帧执行完毕后,开始逐个释放,如下原创 2020-11-16 12:57:08 · 285 阅读 · 0 评论 -
04-线程创建
Thread创建package org.msi.threadLearn.demo01_create_thread;import lombok.extern.slf4j.Slf4j;@Slf4j(topic="c.Test1")public class CreateThreadWay01 { public static void createByThread(){ Thread t1 = new Thread(){ public void ru.原创 2021-01-19 13:07:00 · 202 阅读 · 0 评论 -
03-常用的各平台进程查看方式
windows:tasklist查看进程信息 taskkill杀死进程linuxps -ef查看所有进程 ps -ef | grep java查看Java启动的进程 ps -fT -p <PID>查看整个进程(PID)的所有线程 kill杀死进程 top动态查看所有线程,可以动态显示cpu内存占用状态 top -H 按照大写H来切换是否显示线程 top -H -p <PID>查看某个进程(PID)的所有线程Javajps命令查看 j...原创 2020-11-16 12:50:10 · 121 阅读 · 0 评论 -
02-进程和线程
进程:把程序从磁盘加载到内存中并运行的应用程序。是资源调度的基本单位(每个进程都有自己独立的一块内存空间,这个空间就是一个资源单位),比如在Windows系统中,一个运行的xx.exe就是一个进程。线程:Java中 线程是cpu执行调度的最小单位,golang中 协程是cpu执行调度的最小单位二者关系:进程是存储程序资源的基本单位,线程是cpu调度执行的基本单位,大白话就是二者都是存储空间,只不过任务不同,所以也可以叫 进程空间,线程空间 进程空间负责程序(操作系统把磁盘的程序内容称.原创 2021-01-14 12:42:56 · 157 阅读 · 0 评论 -
01-并发和并行
并发:如图内容,cpu的core只有一个,一个core不管对一个线程还是对多个线程,实质都是串行,原因很简单,core同一时间点只能处理一个线程,又因为执行的时间片大概是10~15ms,而人最快反应也要0.1s,就是100ms,这才会给你一种一瞬间执行了好多内容的感觉虽然是串行,但是确实在100ms内执行了多个线程,这种在很短的时间段内能执行多次线程的能力就是并发能力,这也是JavaScript虽然是单线程语言,但也可以实现高并发应用的原因并行:我学生时代的笔记本就是这种..原创 2021-01-14 13:12:24 · 156 阅读 · 0 评论