![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 65
鸭鸭老板
偏执只会左右你的思考
展开
-
Java --- 对象内存布局与对象头
它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)(保证8个字节的倍数)对象头分为对象标记(MarkOop)与类元信息(KlassOop),类元信息存储的是指向该对象类元数据(Klass)的首地址。对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。原创 2023-02-21 10:16:46 · 259 阅读 · 0 评论 -
Java --- JUC之ThreadLocal
JVM内部就维护了一个线程版的Map(通过ThreadLocal对象的set方法,结果把ThreadLocal对象自己当做key,放进了ThreadLocalMap中),每个线程要用到这个T的时候,用当前的线程去Map里面获取,通过这样让每个线程都拥有了自己独立的变量,各自一份,竞争条件被彻底消除,在并发模式下是绝对安全的变量。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了。原创 2023-02-07 20:14:59 · 294 阅读 · 0 评论 -
Java --- JUC之原子类
。原创 2023-01-14 16:53:29 · 652 阅读 · 0 评论 -
Java --- JUC之CAS
CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,以达到锁的效果,至于自旋:就是自己旋转,指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,当线程发现锁被占用时,会不断循环判断锁的状态,直接获取。执行cmpxchg指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行CAS操作,也就是说CAS的原子性实际上是CPU实现独占的,比用synchronized重量级锁,这里的排他时间要短很多,所以在多线程情况下性能会比较好。原创 2023-01-05 00:23:40 · 145 阅读 · 0 评论 -
Java --- JUC之volatile
内存屏障(也称内存栅栏,屏障指令,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重新排序。内存屏障其实就是一个JVM指令,Java内存模型的重排规则会要求Java编译器在生产JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatile实现了Java内存模型中的可见性和有序性(禁重排),但volatile无法保证原子性。因此重排序时,不允许把内存屏障之后的指令重排序到内存屏障之前。原创 2023-01-03 06:03:10 · 300 阅读 · 0 评论 -
Java --- JUC之JMM
1、JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象时概念并不是真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定了一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。2、主要作用:①、通过JMM来实现线程和主内存之间的抽象关系。②、屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。原创 2022-12-29 09:29:13 · 270 阅读 · 0 评论 -
Java --- JUC之LockSupport
调用unpark(thread)方法后,就会将thread线程的许可证permit发放,会自动唤醒park线程,即之前阻塞中的LockSupport.park()方法会立即返回。permit许可证默认没有不能放行,所以一开始调park()方法当前线程就会阻塞,直到到别的线程给当前线程发放permit,park方法才会被唤醒。因为unpark获得了一个凭证,之后再调用park方法,就可以名正言顺的凭证消费,故不会阻塞。Condtion中的线程等待和唤醒方法,需要先获取锁,要先await后signal。原创 2022-12-27 10:29:35 · 723 阅读 · 0 评论 -
Java --- JUC之线程中断机制
一个线程不应该由其他线程来强制中断或停止,而是应该线程自己自行停止,自己来决定自己的命运。所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了。在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制-----中断,也为中断标识协商机制。中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。原创 2022-12-26 07:30:00 · 524 阅读 · 0 评论 -
Java --- JUC之多线程
1、恢复挂起的线程到真正锁的获取还是有时间差的,从开发人员来看这个时间微乎其微,但从CPU的角度来看,这个时间差存在的还是很明显的。2、使用多线程很重要的考量点是线程切换的开销,当采用非公平锁时,当一个线程请求锁获取同步状态,然后释放同步状态,所以刚释放锁的线程在此刻再次获取同步状态的概率就变得非常大,所以就减少了线程的开销。非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转或者饥饿的状态(某个线程一直得不到锁)原创 2022-12-25 07:30:00 · 916 阅读 · 0 评论 -
Java --- JUC的CompletableFuture的使用
Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果,取消任务的执行,判断任务是否被取消,判断任务执行是否完毕等。如:主线程让一个子线程去执行任务,子线程在执行过程中过于耗时,启动子线程开始执行任务后,主线程就去做其他事情,当主线程将需要其他实现做完后,等一会再去获取子任务系统的执行结果或变更的任务状态。小结:Future接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务。原创 2022-12-24 08:00:00 · 1028 阅读 · 0 评论 -
Java学习 --- JUC的读写锁实现
一、读写锁的实现public class ThreadDemo06 { public static void main(String[] args) { MyCache myCache = new MyCache(); //创建线程存数据 for (int i = 1; i <= 5 ; i++) { String num = i+""; new Thread(()->{原创 2022-03-24 00:05:54 · 465 阅读 · 0 评论 -
Java学习 --- JUC辅助工具类
一、CountDownLatch减少计数辅助类public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 1; i <= 6 ; i++) { new T原创 2022-03-23 16:09:01 · 155 阅读 · 0 评论 -
Java学习 --- JUC的Callable创建线程
一、使用Callable创建线程public class ThreadDemo05 { public static void main(String[] args) throws ExecutionException, InterruptedException { //使用Runnable创建线程 new Thread(new A(),"aa").start(); //使用Callable创建线程 FutureTask<In原创 2022-03-22 23:55:44 · 110 阅读 · 0 评论 -
Java学习 --- JUC的死锁
一、死锁死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。二、造成的原因1、系统资源不足2、进程运行推进不合适3、资源分配不当public class DeadLock { public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object();原创 2022-03-22 23:09:44 · 573 阅读 · 0 评论 -
Java学习 --- JUC的可重入锁
一、可重入锁1、使用synchronized 实现public class ThreadDemo02 { public static void main(String[] args) { Object o = new Object(); new Thread(()->{ synchronized (o){ System.out.println(Thread.currentThread().get原创 2022-03-22 22:40:46 · 203 阅读 · 0 评论 -
Java学习 --- JUC集合线程安全异常与解决
由于ArrayList集合是线程不安全的会报java.util.ConcurrentModificationException的并发修改异常。原创 2022-03-22 21:16:58 · 490 阅读 · 0 评论 -
Java学习 --- JUC线程通信定制化
要求线程按照顺序打印AA打印5次,BB打印10次,CC打印15次,依次循环十次。原创 2022-03-22 20:38:01 · 105 阅读 · 0 评论 -
Java学习 --- JUC线程通信
案例:使用两个线程,实现对一个初始值是0的变量操作,一个线程对其进行加一操作,另一个线程对其进行减一操作,这个过程就是线程通信。三步骤:判断、干活、通知上面的代码存在虚假唤醒运行结果:原因是wait方法引起的:由于wait方法的特点就是在那里睡就在那里醒,会导致if判断条件失效。......原创 2022-03-22 19:44:47 · 389 阅读 · 0 评论 -
Java学习 --- JUC的lock接口
一、juc的概述在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collection 实现等。二、线程1、用户线程package com.cjc.juc;public class Main { public static void main(String[原创 2022-03-22 18:49:00 · 542 阅读 · 0 评论