JUC
文章平均质量分 96
lix2560
联系博主WX: l2560i 邮箱:l2560i@163.com
展开
-
学习日志:线程池
顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。原创 2024-07-20 16:37:59 · 593 阅读 · 0 评论 -
学习日志:ThreadLocal
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中自带的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。原创 2024-07-20 15:49:43 · 694 阅读 · 0 评论 -
学习日志:Atomic 原子类
Atomic 翻译成中文是原子的意思。Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示。根据操作的数据类型,可以将 JUC 包中的原子类分为 4 类1.基本类型使用原子的方式更新基本类型AtomicInteger:整型原子类。原创 2024-07-20 15:23:15 · 974 阅读 · 0 评论 -
学习日志:AQS抽象队列同步器
AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS 就是一个抽象类,主要用来构建锁和同步器。原创 2024-07-20 14:53:41 · 1086 阅读 · 0 评论 -
学习日志:ReentrantLock
由于 synchronized锁是可重入的,同一个线程在调用method1() 时可以直接获得当前对象的锁,执行 method2() 的时候可以再次获取这个对象的锁,不会产生死锁问题。假如synchronized是不可重入锁的话,由于该对象的锁已被当前线程所持有且无法释放,这就导致线程在执行 method2()时获取锁失败,会出现死锁问题。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果是不可重入锁的话,就会造成死锁。原创 2024-07-18 19:49:35 · 638 阅读 · 0 评论 -
学习日志:synchronized 关键字
在 Java 早期版本中,synchronized 属于重量级锁,效率低下。这是因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。原创 2024-07-18 17:12:03 · 735 阅读 · 0 评论 -
学习日志:乐观锁与悲观锁
JDK 1.5 以后的 AtomicStampedReference 类就是用来解决 ABA 问题的,其中的 compareAndSet() 方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。并且,悲观锁还可能会存在死锁问题,影响代码的正常运行。原创 2024-07-18 16:15:01 · 1748 阅读 · 0 评论 -
学习日志:volatile 关键字
在 Java 中,volatile 关键字可以保证变量的可见性,如果将变量声明为 volatile ,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。原创 2024-07-18 15:17:15 · 1855 阅读 · 0 评论 -
学习日志:JMM(Java 内存模型)
JMM(Java 内存模型)主要定义了对于一个共享变量,当另一个线程对这个共享变量执行写操作后,这个线程对这个共享变量的可见性。要想理解透彻 JMM(Java 内存模型),我们先要从CPU 缓存模型和指令重排序说起!ava 是最早尝试提供内存模型的语言,其主要目的是为了简化多线程编程,增强程序可移植性的。CPU 可以通过制定缓存一致协议(比如 MESI协议open in new window)来解决内存缓存不一致性问题。为了提升执行速度/性能,计算机在执行程序代码的时候,会对指令进行重排序。原创 2024-07-17 16:16:53 · 996 阅读 · 0 评论 -
学习日志:java线程
这里总结线程的一些概念以及使用。原创 2024-07-16 21:06:41 · 974 阅读 · 0 评论