juc

JUC

倾然丶 夕夏残阳落幕 提交于 2020-03-06 18:29:45
volatile 关键字和内存可见性: 内存可见性(Memory Visibility)是指当①某个线程正在使用对象状态,而②另一个线程在同时修改该状态,需要③确保当一个线程修改了对象 状态后,④其他线程能够看到发生的状态变化。----- 在程序运行的时候,jvm会为每个线程分配一块独立的缓存,其中有一块主存(存放着共享资源),线程一用于修改共享数据,main线程用于读共享数据, 当线程一要对主存中共享数据的值进行改变的时候,先把共享数据读到缓存中来,然后在修改值,修改完后,将修改好后的值写会到主存中去, 在将修改后的值写入主存中前,此时main线程从主存中的数据读取出来,按理来说是先线程一执行修改数据,在main线程读取修改后的数据, 由于在线程一共享数据写入主存之前就执行main线程中读取共享数据,所以导致main线程缓存中的值是修改前的值(按代码逻辑来说是修改后的), 此时main线程缓存中存放的值是修改前的值,当调用了比较底层的代码(例如while(true)),执行效率非常高,高到main线程没有机会再次去主存中 读取一次数据(就是线程一修改后的,即逻辑正确情况)。 内存可见性问题是,当多个线程操作共享数据时,彼此不可见(由于首先读取线程的数据(共享数据)是不符合代码逻辑的,再加上某个底层代码执行效率太高,读取线程无法再次去主存中获取最新数据)

5.互联网大厂高频面试题-volatile

▼魔方 西西 提交于 2020-03-05 13:34:02
请谈谈你对volatiel的理解? 文章目录 volatile是什么 JMM内存模型之可见性 volatile是什么 首先JUC指的是java的三个包: 首先这个关键字在你日常的单线程工作环境下你是用不到的。 它的3大特性: JMM内存模型之可见性 来源: CSDN 作者: 余生的观澜 链接: https://blog.csdn.net/qq_25310669/article/details/104665678

JUC并发编程(一)

左心房为你撑大大i 提交于 2020-03-04 11:51:48
1、什么是JUC JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。 2. 线程基础知识 进程是指运行中的应用程序,是操作系统进行资源(CPU,内存空间,磁盘IO)分配的最小单位。用户每启动一个进程,操作系统就会为该进程分配一个独立的地址空间(内存空间)目前操作系统支持多进程多任务 eg:QQ.exe 2.1.1 特点 独立性:不同的进程之间是独立的,相互之间资源不共享 动态性:进行在系统中不是静止不动的,而是在系统中一直活动的 并发性:多个进程可以在单个处理器上同时进行且互补影响 2.2 线程 线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的,能独立运行的基本单位,是进程的组成部分,一个进程可以有多个线程,线程共享进程所拥有的全部资源,每个线程去处理一个特定的子任务,必须依赖于进程而存在。 多线程实际上是交替占用CPU资源,而非我们表面看起来的并行执行。main方法是单线程 2.2.1 特点 线程的执行是抢占式的 多个线程在同一个进程中可以并发执行(CUP快速的在不同线程之间切换,CPU时间片轮转机制) 当前运行的线程在任何时候都有可能被挂起,以便另外一个线程可以运行 2.2.2 优点 充分利用CPU的资源 加快响应用户的时间 可以使你的代码模块化,异步化,简单化 2.2.3

JAVA JUC

非 Y 不嫁゛ 提交于 2020-03-04 03:55:54
文章目录 JAVA JUC 一、Volatile 关键字-内存可见性 1、java线程的6种状态Thread.state: 2、JAVA多线程:判断 干活 改标志位加唤醒通知(详见Thread.start()方法) 3.一共两个线程 (1)同步锁:synchronized关键字,使两个线程同步 (2)Volatile关键字 (3)Volatile与Scnchronized比较 二、原子变量与CAS算法 1、i ++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” 2、原子变量:JDK1.5以后 java.util.concurrent.atomic 包下提供了常用的原子变量 (1)原子变量特性 (2)原子性的解决过程:(先读取内存值,再进行比较,再进行赋值和写入) (3)原子变量的使用: 三、模拟CAS算法 四、ConcurrentHashMap锁分段机制 1、hashmap和hashtable区别: 2、ConCurrentHashMap采用“锁分段”机制 3、CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” 4、CountDownLatch(==闭锁==,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行) 四、创建执行线程的方式三:实现Callable接口 五、Lock同步锁 1

Java多线程与JUC——01理解进程线程的概念

青春壹個敷衍的年華 提交于 2020-03-03 22:15:36
今天开始认真的学一下Java线程与JUC,所以开辟一个新的专栏来记录笔记。希望也能对你的学习有所帮助,喜欢的话就多多关注我吧。我会一直将我的笔记传到我的博客上与大家分享交流。 1.进程 几乎所有的操作系统都支持进程概念,进程是处于运行过程中的程序, 进程是操作系统中进行资源分配的基本单位。 一般而言进程包含如下三个基本特征 。 独立性 :指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。没有进程本身的同意,其他进程是不能访问到该进程所有的地址空间。 动态性 :进程与程序的区别在于, 程序只是一个静态的指令集合 ,而 进程是一个正在系统中活动的指令集合 。在进程中加入了时间的概念。进程具有自己的生平周期和各种不同的状态,这些概念在程序中都是不具备的。 并发性 :多个进程可以在单个处理器上并发执行。 并发性与并行性的区别 并行性 :指在同一时刻,有多条指令在多个处理器上同时执行; 并发性 :指在同一时刻只能有一条指令执行。但 多个进程指令被快速轮换执行 ,使得宏观上具有多个进程同时执行的效果。 进程是状态 2.线程 线程则扩展了进程的概念,使得同一个进程可以同时并发出多个任务 线程是进程的执行单元,是进程的组成部分,一个进程可以拥有多个线程,每个线程必须有一个父进程。 线程是独立运行的

JUC锁框架——CyclicBarrier

荒凉一梦 提交于 2020-03-02 12:47:40
CyclicBarrier的简单介绍 CyclicBarrier是一个同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。通过它可以完成多个线程之间相互等待,只有当每个线程都准备就绪后,才能各自继续往下执行后面的操作。 CyclicBarrier通过计数器来实现的。当某个线程调用await方法时,该线程进入等待状态,计数器加1,当计数器的值达到设置的初始值时,所有因调用await进入等待状态的线程被唤醒,继续执行后续操作。 因为CycliBarrier在释放等待线程后可以重用,所以称为循环barrier。CycliBarrier支持一个可选的Runnable,在计数器的值到达设定值后(但在释放所有线程之前),该Runnable运行一次 ,注,Runnable在每个屏障点只运行一个。 CyclicBarrier与CountDownLatch比较 CyclicBarrier与CountDownLatch本质上都是依赖于volatile和CAS实现,两者比较如下: |CyclicBarrier|CountDownLatch| |:|:| |一个线程(或者多个),等待另外N个线程完成某个事情之后才能执执行|N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。| |一次性的|可以重复使用| |基于AQS|基于锁和Condition

多线程进阶——JUC并发编程之Synchronized底层实现概论🔥

 ̄綄美尐妖づ 提交于 2020-03-02 01:07:17
1、Synchronized简介 Java中提供了两种实现同步的基础语义: synchronized 方法和 synchronized 块 ,下面我们来操作一番: public class SyncTest { public void syncBlock(){ synchronized (this){ System.out.println("sync block balabala...."); } } public synchronized void syncMethod(){ System.out.println("sync method hahaha...."); } public static void main(String[] args) { } } 将SyncTest.java 编译为SyncTest,.class文件,我们使用 javap -v SyncTest.class 查看class文件对应的JVM字节码信息。这里我使用的是JVM版本是JDK1.8。 { ... public void syncBlock(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=3, args_size=1 0: aload_0 1: dup 2: astore_1 3: monitorenter 4:

多线程进阶——JUC并发编程之Executors框架设计思想一探究竟🔥

浪子不回头ぞ 提交于 2020-03-01 16:55:31
1、学习切入点 Executors 框架是整个JUC 包中类/接口关系中最为复杂的框架,真正理解Executors框架的前提是理清楚各个模块之间的关系,高屋建瓴, 从整体到局部 才能透彻理解各个模块的功能和背后设计的思路! 本文将从 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable 这些核心模块展开分析。 2、从Executor谈起 Executor 是JDK 1.5 时,随着JUC引入的一个接口,引入该接口的主要目的是 解耦任务本身和任务执行。我们之前通过线程执行一个任务时,往往需要先创建一个线程.satrt()去执行任务, 而Executor 接口解耦了任务和任务的执行,该接口只有一个方法,入参为待执行的任务。 public interface Executor { /** * 执行给定的Runable任务 * 根据Executor接口的实现类不同,具体执行方式也不同 */ void execute(Runnable command); } 我们可以像下面这样执行任务,而不必心线程的创建 Executor executor = anExecutor executor.execute(new RunnableTask1()); executor.execute(new

JUC学习之生产者消费者案例(Condition方式)

▼魔方 西西 提交于 2020-03-01 16:12:12
一、简介 上一篇我们介绍了使用传统的synchronized结合wait()/notifyAll()线程通信机制实现了生产者消费者案例,并且介绍了多线程交互中常见的虚假唤醒现象。我们都知道,Lock同步锁其实可以代替synchronized完成同步功能,并且使用起来还没有那么复杂,本文将介绍如何使用Lock实现生产者消费者案例。 下表是synchronized和Lock实现线程通信方法的区别: synchronized Lock wait() await() notifyAll() signalAll() Lock结合Condition可以替代synchronized实现同步功能,JDK官网介绍如下: 并且官网也给了Condition的使用示例: class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws

多线程进阶——JUC并发编程之抽象同步队列AQS框架设计理念一探究竟🔥

独自空忆成欢 提交于 2020-03-01 13:46:10
1、学习切入点 既然AQS是一个提供给我们使用的框架,那么我们可以看看这个框架都有哪些类依赖它。 从框架来看, AQS定义了一套多线程访问共享资源的同步器框架 ,许多同步类实现都依赖于它,如常用的 ReentrantLock/Semaphore/CountDownLatch... 等。 现在看来我们还有点懵逼,这个框架具体是怎么设计的?下面我们翻看源码注释一探究竟!其中 AQS里面维护了一个Node节点构造的CLH队列(FIFO)先进先出队列 。 /** * <p>To enqueue into a CLH lock, you atomically splice it in as new * tail. To dequeue, you just set the head field. * <pre> * +------+ prev +-----+ +-----+ * head | | <---- | | <---- | | tail * +------+ +-----+ +-----+ * </pre> * * <p>Insertion into a CLH queue requires only a single atomic * operation on "tail", so there is a simple atomic point of * demarcation