JUC并发编程
文章平均质量分 68
苏三有春
You are more than you have become,you must take your responsibility
展开
-
JUC并发编程——各种锁的理解(基于狂神说的学习笔记)
false == true,所以会进入循环,循环体内什么都没有,又会进入判断,周而复始,直到那个线程unlock,调用CAS将thread修改为null。至此,读者可以看到,T1在打印“has this lock”之后,T2是无法持有该锁,它在不断地自旋,即进入while循环一直判断,我们来看一下这个代码在做什么。可以类比成:当你拿到进入一个房子的锁,进入房子后,再拿到进入卧室的锁,进入卧室,此时,就算你已经拿到了卧室的锁,你也并没有放弃房子的锁,别人依然进不来房子。synchronized版。原创 2023-10-20 19:41:53 · 221 阅读 · 0 评论 -
JUC并发编程——CAS与原子引用(基于狂神说的学习笔记)
CAS 是Java设置的CPU的并发原语Java是无法直接操作内存的但Java可以调用C++而C++可以操作内存Java可以通过native类调用C++来操作内存CAS = Compare And Set 比较并交换CAS是:比较当前内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作,如果不是就一直循环比较(自循环)1、自循环会耗时2、一次性职能保证一个共享变量的原子性3、会存在ABA问题/***/原创 2023-10-19 19:15:53 · 201 阅读 · 0 评论 -
JUC并发编程——单例模式(基于狂神说的学习笔记)
使用synchronized与volatile的懒汉式单例。以上单例都不安全,使用反射即可破坏单例。使用枚举单例模式,反射无法破坏枚举单例。原创 2023-10-19 19:13:48 · 561 阅读 · 0 评论 -
JUC并发编程——Volatile详解(基于狂神说的学习笔记)
然后A又抢到CPU资源,因为A之前的操作停留在num++上,也就是说,它的下一步是将num写入内存(机器很傻,它不会察觉自己手上的num已经发生改变,而是遵循着代码的顺序,执行下一条指令,而num++后的下一条指令为“把num写入内存”)它将自己手上的num,也就是51,又写进内存。因此,A线程与B线程进行了两次num++操作,理应num应该从50变到52,结果只是从50变成51,而在程序中,这种情况可能出现,也可能不会出现,可能在任何时候出现,因此无法预测,每一次运行都是一个全新的结果。原创 2023-10-18 19:32:24 · 186 阅读 · 0 评论 -
JUC并发编程——JMM详解(基于狂神说得到学习笔记)
参考文献JMM概述-CSDN博客内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行”。原创 2023-10-18 19:30:36 · 221 阅读 · 0 评论 -
JUC并发编程——ForkJoin与异步回调
ForkJoin在JDK1.7出现 ,并行执行任务,在大数据量下,能够提高效率讯飞星火提供的说法:Forkjoin是一种并行计算的算法,用于将一个大任务分解为多个小任务,然后将这些小任务分配给不同的线程或进程来并行执行,最后再将结果合并。在计算机科学中,Forkjoin通常用于实现基于分治策略的程序和数据结构,例如排序算法、图遍历算法、哈希表等。它可以有效地利用多核处理器的并行计算能力,提高程序的性能。原创 2023-10-18 00:01:54 · 211 阅读 · 0 评论 -
JUC并发编程——Stream流式计算(基于狂神说的学习笔记)
Stream流式计算是一种基于数据流的计算模式,它可以对数据进行实时处理和分析,而不需要将所有数据存储在内存中。Stream流式计算是将数据源中的数据分割成多个小的数据块,然后对每个小的数据块进行并行处理,最后将处理结果合并。这种方式可以大大提高程序的执行效率,因为每个小的数据块都可以在一个独立的线程中进行处理,而不需要等待整个数据集被处理完毕。Stream流式计算的优点有很多,其中最重要的是它可以大大提高程序的执行效率。Stream采用了一种延迟计算的机制只有在终止操作时才会触发计算。原创 2023-10-18 00:00:13 · 243 阅读 · 0 评论 -
JUC并发编程——四大函数式接口(基于狂神说的学习笔记)
函数式接口:只有一个方法的接口 ,例如:Runnable接口。断定型接口:只有一个输入参数,返回值为boolean。在新版本的框架底层中,函数式接口有大量的应用。函数型接口,有一个输入参数,有一个输出。消费型接口,有一个参数,没有返回值。供给型接口:没有参数,只有返回值。简化编程模型,使代码更加可读易懂。原创 2023-10-16 22:43:43 · 239 阅读 · 0 评论 -
JUC并发编程——线程池学习:基础概念及三大方法、七大参数、四大拒绝策略(基于狂神说的学习笔记)
在上述例子中,因为for循环开启了10个线程,大于线程池的最大承载量(5+3=8),如果线程处理速度不够快,在最大承载量到达之前又来了请求,则会触发拒绝策略,而AbortPolicy()拒绝策略则是,当超过线程池最大承载量时,则会放弃之后请求,并抛出异常。maximumPoolSize:线程池最大容量(线程池并非时时刻刻所有线程都开启的,时时刻刻一直开启的只有核心线程),当阻塞队列已满,线程池还有未开启线程时,线程池将会开启未启动的线程。池化技术的本质:事先准备好一些资源,线程复用,用完即还,方便管理。原创 2023-10-16 22:42:11 · 555 阅读 · 0 评论 -
JUC并发编程——阻塞队列(基于狂神说的学习笔记)
它的内部只能够容纳单个元素,如果队列已有一元素的话,试图向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中抽走。同样,如果队列为空,试图向队列中抽取一个元素的线程将会阻塞,直到另一个线程向队列中插入了一条新的元素。SynchronousQueue是Java中的一种特殊队列,它是一个线程安全的队列,不存储任何元素,每次插入操作必须等待其他线程的删除操作,反之亦然。打印put -----> take语句执行 -----> put语句执行。当读取时,如果队列为空,则必须阻塞等待。原创 2023-10-15 12:53:21 · 169 阅读 · 0 评论 -
JUC并发编程——读写锁(基于狂神说的学习笔记)
读写锁是否会提高使用互斥锁的性能取决于与被修改相比读取数据的频率,读写操作的持续时间以及数据的争用 - 是,将尝试同时读取或写入数据的线程数。此外,如果读取操作太短,则读写锁定实现的开销(其本质上比互斥锁定更复杂)可以支配执行成本,特别是因为许多读写锁定实现仍然通过序列化所有线程。理论上,使用读写锁所允许的并发性的增加将导致相互使用互斥锁的性能提高。实际上,这种并发性的增加只能在多处理器上完全实现,并且只有在共享数据的访问模式合适时才能实现。读写锁允许访问共享数据的并发性高于互斥锁允许的并发性。原创 2023-10-15 12:51:38 · 163 阅读 · 0 评论 -
JUC并发编程——常用的辅助类(基于狂神说的学习笔记)
每次线程调用countDown()数量-1,假设计数器变为0,countDownLatch.await()就会被唤醒,继续执行。// 释放当前抢占资源的线程,如果还有线程等待工作,换下一个线程进来。命令,该命令在每个障碍点运行一次,在聚会中的最后一个线程到达之后,但在释放任何线程之前。acquire()方法,使线程获得资源,每有一个线程获得资源,信号量-1,若信号量为0,则剩余线程等待。release()方法,释放,会将当前的信号量释放并+1,然后唤醒等待的线程。是一种多功能同步工具,可用于多种用途。原创 2023-10-14 17:29:25 · 269 阅读 · 0 评论 -
JUC并发编程——集合类不安全及Callable(基于狂神说的学习笔记)
CopyOnWriteArrayList使用了一种特殊的写时复制机制,它在对数组进行修改时,会创建一个新的副本,而不是直接在原数组上进行修改。然而,由于每次修改都需要创建一个新的副本,所以在写入操作频繁的情况下,CopyOnWriteArrayList的性能可能会比较低。在写时复制策略中,数据结构被修改时,修改操作会在一个新的副本上进行,而不是直接在原始数据上进行。由于创建新数组和修改操作是在一个单独的写锁上进行的,因此多个线程可以同时读取原始数组,而不会看到正在进行的写入操作。关键字来实现线程安全。原创 2023-10-14 17:24:15 · 647 阅读 · 0 评论 -
JUC并发编程——8锁现象(基于狂神说的学习笔记)
static 则表名该方法与Class同步产生,因此,static是在Class对象中的,如果synchronized锁锁住了static方法,则表明锁住了整个Class对象,而因为Class对象唯一(所有的实例对象都通过Class对象创建的)因此,无论后续创建了多少个实例对象资源,最终只要某一线程持有住某一静态同步方法的锁,则其他静态同步方法一律无法使用。8个锁的问题,两两分组,问题,答案,代码皆在下面代码块中,如有问题后续补充。普通同步锁实例,静态同步锁模板,即使再多实例在,静态之间统一管。原创 2023-10-12 22:14:42 · 167 阅读 · 0 评论 -
JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)
JUC时java.util工具包中的三个包的简称业务:普通的线程代码中,我们常使用Runnable接口但Runnable没有返回值,且效率相比较于Callable来说相对较低,功能也没有Callable强大Lock锁与synchronized锁的区别要分清在多线程情况下,不要使用if条件语句来判断是否wait或await某一线程,要用while循环语句来判断,否则线程不安全。原创 2023-10-12 22:02:37 · 1426 阅读 · 0 评论