JUC并发编程
文章平均质量分 83
嗯mua.
这个作者很懒,什么都没留下…
展开
-
【JUC】Synchronized与锁升级
用锁能够实现数据的安全性,但是会带来性能下降。无锁能够基于线程并行提升程序性能,但是会带来安全性下降。如何达到两者的平衡呢?用的锁是存在java对象头里的Mark Word中。锁升级功能主要依赖Mark Word中锁标志位和释放偏向锁位Mark Word存储的是偏向的线程ID。Mark Word存储的是指向线程栈中 Lock Record 的指针。Mark Word存储的是指向堆中的 monitor 对象的指针。原创 2023-05-23 00:41:31 · 580 阅读 · 0 评论 -
【JUC】Java对象内存布局和对象头
默认配置:启动了压缩指针,对象头是12个字节,实例数据2个字节,那么这个对象大小就是 12 + 2 + 2(对齐填充) = 16字节。手动配置:关闭了压缩指针,对象头是16个字节,实例数据2个字节,那么这个对象大小就是 16 + 2 + 6(对齐填充) = 24字节。存放类的属性(Field)数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。对象,对象头16个字节,实例数据5个字节,所以对象头+实例数据=21个字节。都占8个字节,所以对象头的大小为16个字节。原创 2023-05-22 00:25:16 · 1381 阅读 · 0 评论 -
【JUC】ThreadLocal
ThreadLocal 提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。常用API:ThreadLocal 初始化:return 0;} };需求:5个房屋中介,每个人随机卖出几套房子,统计各自的销售额class House //资源类 {} } /**原创 2023-04-30 23:42:55 · 1542 阅读 · 0 评论 -
【JUC】原子操作类
原子更新带有标记位的引用类型对象,它的定义就算将状态戳简化为。携带版本号的引用类型原子类,可以解决。可以记录修改过几次变量。原创 2023-04-22 21:26:24 · 661 阅读 · 2 评论 -
【JUC】CAS
在Java并发编程中,CAS是一种非阻塞的算法,即(比较并交换)。CAS通过比较内存中某个位置的值和预期值,如果相同,则将该位置的值更新为新值;否则不进行任何操作。(和乐观锁的思想类似)在多线程并发执行时,如果同时有多个线程尝试更新同一个位置的值,只有一个线程会成功,其他线程会失败,但它们并不会被阻塞,而是可以立即重新尝试(自旋)。} }运行结果如下:CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。原创 2023-04-22 17:04:49 · 393 阅读 · 0 评论 -
【JUC】Java内存模型之JMM
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到的线程自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的。但是为了提高性能,编译器和处理器通常会对执行序列进行重排序。原创 2023-04-14 21:02:31 · 743 阅读 · 0 评论 -
【JUC】volatile和JMM
(也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。因此重排序时,不允许把内存屏障之后的指令重排序到内存屏障之前。的所有写操作都要回写到主内存,禁重排,通过内存屏障禁重排。原创 2023-04-14 22:44:58 · 678 阅读 · 0 评论 -
【JUC】 LockSupport类的park等待和unpark唤醒
LockSuppot:用于创建锁和其他同步类的基本线程阻塞原语。这个类与每个使用它的线程相关联,一个许可证(在Semaphore类的意义上)。如果许可证可用,则呼叫park将park返回,在此过程中消耗它;否则可能会阻止。致电unpark使许可证可用,如果尚不可用。(与信号量不同,许可证不能累积,最多只有一个。LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能, 每个线程都有一个许可(permit),permit只有两个值1和零,默认是零。原创 2023-04-06 00:27:45 · 428 阅读 · 0 评论 -
【JUC】公平锁和非公平锁
需要注意的是,公平锁会带来更多的线程切换和等待开销,会影响性能。因此,一般情况下,默认的锁实现都是非公平锁,只有在确有必要时才使用公平锁。同时,在使用公平锁时需要注意锁的获取和释放的开销较大,需要谨慎使用。:是指多个线程获取锁的顺序并不是按照申请锁的顺序,类似插队买票,有可能后申请的线程比先申请的线程先获取锁,在高并发环境下, 有可能造成优先级反转或者。:是指多个线程按照申请锁的顺序来获取锁,这里类似排队买票,先到先得,后来的在后面排队,这是公平锁。原创 2023-04-03 17:45:22 · 257 阅读 · 0 评论 -
【JUC】CompletableFuture对Future的改进
在java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。get()方法也会等待当前CompletableFuture对象的执行结果,但不同的是,如果执行过程中出现了异常,则会抛出Checked Exception(ExecutionException),这需要进行捕获或者声明抛出。这两种方法都违背了“异步”思想。原创 2023-04-03 10:51:09 · 319 阅读 · 0 评论 -
【JUC】线程池
它将核心线程数和最大线程数设置值相同,并且非核心线程的空闲时间设置为0,因为根本就没有非核心线程,全是核心线程,并且采用的是一个无界的LinkedBlockingQueue作为等待队列。我们最终发现,该方法也是通过调用7个参数的线程池构造方法来创建的线程池。线程池在执行任务的过程中如果抛出了异常,那么线程池就会销毁这个线程。除了自己创建线程池这一方法,我们也可以使用。原创 2023-03-28 19:02:53 · 465 阅读 · 0 评论 -
【JUC并发编程】异步模式之生产者/消费者
【代码】【JUC并发编程】异步模式之生产者/消费者。原创 2022-12-24 22:50:12 · 99 阅读 · 0 评论 -
【JUC并发编程】 终止模式之两阶段终止模式
想象一下,我们如何在线程t1中终止线程t2?我们马上就能想到使用线程对象的 方法。但是 会真正 杀死 线程,如果此线程锁住了某些共享资源,那么当杀死这个线程时,线程不会释放锁,其他线程无法获得锁,导致被锁住的共享资源就无法被别人使用了。我们也许还会想到能不能使用 呢?答案是不能!因为我们的目的只是停止程序中的某一个线程,而该方法会将程序中的所有线程都停止,从而退出程序。以上提到的两种方法都无法解决我们遇到的问题,所以我们引入 两阶段终止模式 。案例须知:给出以下案例,可以很好理解两阶段终止模式。运行原创 2022-12-07 15:10:42 · 200 阅读 · 0 评论 -
【JUC并发编程】 同步模式之保护性暂停
*保护性暂停( Guarded Suspension)😗*用在一个线程等待另一个线程的执行结果joinFuture。原创 2022-12-01 22:13:54 · 216 阅读 · 0 评论 -
【JUC并发编程】 wait和notify的使用方式
在了解wait和notify的使用方式前,我们需要先明白和的区别。原创 2022-11-15 10:29:44 · 159 阅读 · 0 评论