
Java并发编程
Java并发编程
JueDream
这个世界都是教我们如何成功,却没人教我们如何接受失败和平庸。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java内存模型之JMM角度分析DCL-XXOO
前言DCL,即Double Check Lock,中卫双重检查锁定。(单例模式)一、单例模式 3 -- 双重加锁(双重检查模式 (DCL))package com.yl.springboottest.consurrency.jmm.dcl;/** * 描述: Java内存模型之从JMM角度分析DCL * * DCL,即Double Check Lock,中卫双重检查锁定。(单例模式) * * @author: yanglin * @Date: 2020-12-07-9...原创 2020-12-11 16:14:31 · 654 阅读 · 0 评论 -
Java内存模型之重排序-XXOO
前言在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:1.在单线程环境下不能改变程序运行的结果;2.存在数据依赖关系的不允许重排序换一句话:无法通过happens-before原则推导出来的,JMM允许任意的排序。一、as-if-serial语义as-if-serial语义的意思是,所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变,编译器、runtime、原创 2020-12-11 15:12:43 · 383 阅读 · 0 评论 -
Java内存模型-happens-before-XXOO
一、happens-before在JMM(Java内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见?我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JDK 5 开始,JMM就使用happ.原创 2020-12-11 15:00:37 · 560 阅读 · 0 评论 -
Java-volatile线程访问共享变量(二)-XXOO
一、volatile的特性1.volatile可见性;对一个volatile的读,总可以看到对这个变量最终的写;2.volatile原子性;volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如i++;3.JVM底层采用“内存屏障”来实现volatile语义;二、volatile与happens-before示例:class VolatileTest1 { int i = 0; volatile bool原创 2020-12-11 14:50:11 · 390 阅读 · 0 评论 -
Java-Volatile线程访问共享变量(一)-XXOO
一、Volatile是什么?volatile是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对volatile的定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。通俗点讲就是说一个变量如果用volatile修饰了,则Java可以确保所有线程看到这个变量的值是一致的,如果某个线程对volatile修原创 2020-12-11 14:41:05 · 1079 阅读 · 0 评论 -
Java同步Synchronized-XXOO
一、Synchronized是什么?synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。二、代码实现1.实现方式Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:1.普通同步方法,锁是当前实例对象2.静态同步方法,锁是当前类的class对象3.同步方法块,锁是括号里面的对象public synchronized void synchronizedStart1(原创 2020-11-27 13:51:12 · 1298 阅读 · 0 评论 -
Java-J.U.C之并发工具类CountDownLatch-XXOO
一、CountDownLatch是什么?CountDownLatch是通过一个计数器来实现的,当我们在new 一个CountDownLatch对象的时候需要带入该计数器值,该值就表示了线程的数量。每当一个线程完成自己的任务后,计数器的值就会减1。当计数器的值变为0时,就表示所有的线程均已经完成了任务,然后就可以恢复等待的线程继续执行。在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownlatch与CyclicBarrier的区别:1.CountDownL原创 2020-11-27 13:45:44 · 453 阅读 · 0 评论 -
Java-J.U.C之并发工具类CyclicBarrier-XXOO
一、CyclicBarrier是什么?CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待, 此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 通俗点讲就是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时, 屏障才会开门,所有被屏障拦截的线原创 2020-11-27 13:36:29 · 590 阅读 · 0 评论 -
多线程任务类型-CPU/I/O-XXOO
一、多线程任务类型多线程任务类型分为CPU 密集型以及I/O 密集型任务CPU 密集型* 这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,* 比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。* 一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。I/O 密集型任务* 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处原创 2020-11-16 15:50:45 · 1145 阅读 · 0 评论 -
多线程-ThreaLocal-线程局部变量-ThreadLocalMap学习
基本结构ThreadLocalMap是ThreadLocal的内部类,内部独立实现了Map功能、Entry功能。成员变量 /** * The initial capacity -- MUST be a power of two. * 他的初始容量——必须是2的幂次方。 */ private static final int INITIAL_CAPACITY = 16; /**原创 2020-10-19 15:51:45 · 379 阅读 · 3 评论 -
多线程-ThreaLocal-线程局部变量学习
定义从Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。作用:提供线程内局部变量,不同线程之间互不干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。换一句话就是为每一个使用该变量的线程都提供一个变量值的副本,使每.原创 2020-10-16 09:14:11 · 292 阅读 · 0 评论