
JUC
文章平均质量分 75
浑水摸鱼仙君
此剑抚平天下不平事,此剑无愧世间有愧人
展开
-
JUC并发编程(13)——线程安全集合类
一、概述线程安全集合类可以分为三大类 :① 遗留的安全集合如Hashtable,Vector。② 使用Collections装饰的线程安全类如Collections.synchronizedList、Collections.synchronizedMap等。③ JUC包下的线程安全集合如Blocking类、CopyOnWrite类、Concurrent类等。①是直接在方法上加上了synchronized锁,②是方法内部加上了synchronized锁。这里主要介绍的是JUC包下的线程安全集合类原创 2021-10-08 16:14:48 · 572 阅读 · 0 评论 -
JUC并发编程(12)——AQS和ReentrantLock源码解析
一、简介1.AQS简介AbstractQueuedSynchronizer(简称AQS),是阻塞式锁和相关同步器工具的框架,是一个抽象类。JUC中很多关于锁的类,其内部使用的同步器来实现功能,而这些同步器都是继承于AQS。...原创 2021-09-27 17:24:53 · 239 阅读 · 0 评论 -
JUC并发编程(11)——线程池
一、自定义线程池任务队列class BlockingQueue<T> { // 任务队列 private Deque<T> queue = new ArrayDeque<>(); // 锁 private ReentrantLock lock = new ReentrantLock(); // 生产者条件变量 private Condition fullWaitSet = lock.newCondition(); // 消费者条件变量 private原创 2021-09-24 16:48:16 · 172 阅读 · 0 评论 -
JUC并发编程(10)——ThreadLocal
一、概述1.介绍ThreadLocal在各线程之间相互隔离只属于当前线程的变量。2.作用① ThreadLocal可以避免参数传递,减少耦合。② 保证了线程之间数据的隔离。3.与synchronized对比① synchronized是采取时间换空间的方式,只提供一份变量,让多个线程排队访问。主要是保证多个线程访问共享资源的同步。② ThreadLocal采用空间换时间的方式,为每一个线程都提供一个变量,从而实现同时访问而互不干扰。主要让多个线程之间的数据相互隔离。二、原理1.Threa原创 2021-09-23 15:26:28 · 94 阅读 · 0 评论 -
JUC并发编程(9)——不可变设计和final
一、介绍 在并发编程中,主要就是处理共享资源的互斥访问。可能会采用加锁来保证并发安全,如synchronized关键字,Lock锁。也可能采用乐观锁的cas保证并发安全。 当共享资源不可更改时,多个线程间并发读取共享资源就不会存在线上安全问题,例如String类就是利用不可变类成为线程安全的类的。 不可变对象(Immutable Object)的定义为:对象一旦被创建后,对象所有的状态及属性在其生命周期内不会发生任何变化。二、如何创建一个不可变类1)所有的成员变量必须是private2)最原创 2021-09-07 15:20:09 · 108 阅读 · 0 评论 -
JUC并发编程(8)——无锁、乐观锁和CAS
一、介绍1.乐观锁 和 悲观锁乐观锁和悲观锁是广义上的概念,根据是否锁住同步数据来判断。悲观锁对同一个数据的并发操作,认为自己在使用数据的时候一定有别的线程来修改数据,因此每次操作同步数据时都会先加锁。在java中synchronized关键字和Lock的实现类都是悲观锁。乐观锁认为自己再使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有更新,当前线程就能更新成功,反之则不行。在java中通过无锁编程来实现。2.无锁乐观原创 2021-09-06 14:42:12 · 405 阅读 · 1 评论 -
JUC并发编程(7)——Unsafe
Unsafe一、介绍Unsafe类在sun.misc包下,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但是正如它的名字,使用它会增加程序出错的概率,使程序变得不安全。二、获取Unsafe实例Unsafe类源码Unsafe类被设计成单例,提供了一个静态方法getUnsafe获取Unsafe实例。但是调用该方法的类必须为引导类加载器所加载,否则抛出SecurityEx原创 2021-09-03 11:54:00 · 137 阅读 · 0 评论 -
JUC并发编程(6)——JMM、volatile
一、JMM介绍 JMM即Java Memory Model,Java内存模型。它定义了主存、工作内存抽象概念,底层对应CPU寄存器、缓存、硬件内存、CPU指令优化等。 在JMM中,规定了共享变量是放在主内存之中。然后每个线程都有自己的工作内存,工作内存中保存了该线程用到的变量和主内存的副本拷贝。三大特征原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。可见性指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到原创 2021-08-31 11:28:23 · 127 阅读 · 0 评论 -
JUC并发编程(5)——ReentrantLock
介绍jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。ReentrantLock特点① 响应中断可以打断应为竞争锁而进入阻塞的线程ReentrantLock lock = new ReentrantLock(); lock.lockInterrup.原创 2021-08-31 10:02:46 · 133 阅读 · 0 评论 -
JUC并发编程(4)——wait/notify,join原理,park/unpark
一、wait/notify简介wait会让拥有该锁对象的线程进行阻塞,同时释放锁。notify可以随机唤醒一个锁对象阻塞的线程APIobj.wait():让进入object监视器的线程到waitSet等待,线程会释放锁。obj.wait(long timeout):等待多少毫秒。obj.notify():在object上正在waitSet等待的线程中挑一个唤醒,唤醒的线程需要去竞争。obj.notifyAll():让object上正在waitSet等待的线程全部唤醒。知识点①原创 2021-08-26 08:43:37 · 404 阅读 · 0 评论 -
JUC并发编程(3)——偏向锁、轻量锁、重量锁、自旋锁
一、对象的内存布局在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据和对齐填充。1.1 对象头对象头分为两个部分,第一部分用于存储对象自身运行时数据,如哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等,官方统称为Mark Word;第二部分是类型指针,指向方法区的运行时数据区。普通对象数组对象Mark WordMark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit,在32位JVM中的结构为:1原创 2021-08-26 08:43:12 · 390 阅读 · 0 评论 -
JUC并发编程(2)——线程同步的几种方法
多线程操作同一数据会产生线程安全问题,我们采用同步机制来处理。一、synchronized同步代码块格式synchronized(同步监视器){ // 需要同步的代码}锁—同步监视器任何一个类的对象都能当做锁,但是多个线程必须要共用同一把锁。对于实现Runnable方式可以使用this作为锁,继承Thread的方式可以使用Class对象作为锁。同步方法格式public synchronized 方法名(){ // 需要同步的代码}锁—同步监视器在实现Runnabl原创 2021-08-26 08:42:38 · 235 阅读 · 0 评论 -
JUC并发编程(1)——创建线程的几种方式
继承Thread类实现多线程1.创建一个类去继承Thread类。2.重写该类的run()方法,继承要执行的操作写在run()方法里面。3.创建该类的对象。4.调用该对象的start()方法。public class MyThread extends Thread { @Override public void run() { // 线程要执行的方法 } public static void main(String[] args) { Thread myThread1 = new .原创 2021-08-26 08:41:31 · 248 阅读 · 0 评论