线程

Java并发编程:volatile关键字解析

*爱你&永不变心* 提交于 2020-04-06 05:23:52
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快

多线程 CountDownLatch

霸气de小男生 提交于 2020-04-06 02:56:02
import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * 闭锁 * https://www.cnblogs.com/takumicx/p/9698867.html */ public class CountDownLatchTest { private static CountDownLatch countDownLatch; public static void main(String[] args) throws InterruptedException { int count = 10; // 初始化计数器值为10 countDownLatch = new CountDownLatch(count); // 开启10个子线程执行子任务 for (int i = 0; i < count; i++) { Thread thread = new Thread(new CountDownThread(countDownLatch, i)); thread.start(); } // 主线程等待,直到所有子任务完成 countDownLatch.await(); // 模拟主线程执行后续工作 TimeUnit.SECONDS.sleep(1); System.out

原子性,有序性,可见性

纵饮孤独 提交于 2020-04-06 01:01:14
synchronized (原子性 有序性 可见性) volatile (原子性 可见性) 1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。 3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。 4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。 原子性:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束 例如:int i = 1; 该语句为原子操作,因为执行这句话后i的值一定是等于1. 反例:int i= 0; i++ ; 其中 i++不是原子操作,在多线程中会有线程安全问题,i++其实分为三个步骤,1. 读取变量i的值;2:对i进行加一的操作;3.将计算后的值再赋值给变量i synchronized :能保证原子操作。1、锁住主内存,2、执行工作内 3、将工作内存写入主内存。4.释放锁

java JVM内存相关

半世苍凉 提交于 2020-04-06 00:26:24
大家平时知道的java的内存分为栈和堆,一般new出来的对象都是在堆上的。这里用的是一般,也就是说在有些情况下可能不是分配在堆上。在一定的情况下对象也是可以分配到栈上的。首先看一下java JVM运行时的数据区: 图中的 方法区 和 堆 是所有线程共享的, 虚拟栈 , 本地方法栈 和 程序计数器 是线程私有的。也就是说虚拟栈,本地方法和程序计数器是线程隔离的。程序计数器是唯一不会出现oom的部分。 程序计数器 可以看成当前线程执行的字节码的行号暗示器。 虚拟机栈 和线程的生命周期是一样的,当线程执行的时候会创建一个栈帧,用于存放当前线程的方法出口,局部变量表,操作数栈,动态连接等信息。 本地方法栈 用于调用native方法使用。 堆 是所有线程共享的部分,用于存储创建的对象。 方法区 和堆一样都是所有线程共享的,方法区主要用于存放虚拟机加载的类的信息,常量,静态常量等信息。 除了运行时数据区外还有一部分内存是不受虚拟机管理的部分,这一部分就是直接内存,直接内存是直接在物理的memory分配,我们经常使用的 ByteBuffer. allocateDirect 就是直接在物理内存上分配的。但是在虚拟机里面会有这部分内存的引用,以便对这一部分内存进行管理。 本文内容参考《深入理解JAVA虚拟机》 来源: oschina 链接: https://my.oschina.net/u

面试TodoList

╄→гoц情女王★ 提交于 2020-04-06 00:12:56
面试TodoList 面试TodoList 第一站深圳 Spring MySQL JVM 多线程 Netty Redis 知乎看到的Java面经,看到其中部分题目有启发性就记下来了,抽时间逐个解决吧。 查看原文 第一站深圳 多个线程同时读写,读线程的数量远远⼤于写线程,你认为应该如何解决 并发的问题?你会选择加什么样的锁? JAVA的AQS是否了解,它是⼲嘛的? 除了synchronized关键字之外,你是怎么来保障线程安全的? 什么时候需要加volatile关键字?它能保证线程安全吗? 线程池内的线程如果全部忙,提交⼀个新的任务,会发⽣什么?队列全部 塞满了之后,还是忙,再提交会发⽣什么? Tomcat本身的参数你⼀般会怎么调整? synchronized关键字锁住的是什么东⻄?在字节码中是怎么表示的?在内 存中的对象上表现为什么? wait/notify/notifyAll⽅法需不需要被包含在synchronized块中?这是为什 么? ExecutorService你⼀般是怎么⽤的?是每个service放⼀个还是⼀个项⽬ ⾥⾯放⼀个?有什么好处? Spring 你有没有⽤过Spring的AOP? 是⽤来⼲嘛的? ⼤概会怎么使⽤? 如果⼀个接⼝有2个不同的实现, 那么怎么来Autowire⼀个指定的实现? Spring的声明式事务 @Transaction注解⼀般写在什么位置?

jdk1.8源码Thread与Runnable区别

坚强是说给别人听的谎言 提交于 2020-04-05 23:29:38
一、概念 Thread实现了Runnable接口 1 public class Thread implements Runnable { 2 /* Make sure registerNatives is the first thing <clinit> does. */ 3 private static native void registerNatives(); 4 static { 5 registerNatives(); 6 } 7 8 private volatile char name[]; 9 //表示线程的优先级(最大值为10,最小值为1,默认值为5), 10 private int priority; 11 12 13 /* Whether or not the thread is a daemon thread. */ 14 //表示线程是否是守护线程,如果在main线程中创建了一个守护线程, 15 //当main方法运行完毕之后,守护线程也会随着消亡。在JVM中,垃圾收集器线程就是守护线程。 16 private boolean daemon = false; 17 18 19 /* What will be run. */ 20 //表示要执行的任务。 21 private Runnable target; 22 。。。。。。 23 } 二、创建

技术大牛详谈如何正确使用 Volatile 变量

旧时模样 提交于 2020-04-05 23:05:26
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。 本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。 可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。 Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

日常记录

做~自己de王妃 提交于 2020-04-05 22:27:40
react hook useEffect (() => { document.title = `You clicked ${count} times` ; } , [ count ]); // 仅在 count 更改时更新,如果不变 React 会跳过这个 effect ,这就实现了性能的优化 不传第二参数,则如果组件多次渲染(通常如此),则在执行下一个 effect 之前,上一个 effect 就已被清除 如果想执行只运行一次的 effect (仅在组件挂载和卸载时执行),可以传递一个空数组([])作为第二个参数。这就告诉 React 你的 effect 不依赖于 props 或 state 中的任何值,所以它永远都不需要重复执行。这并不属于特殊情况 —— 它依然遵循依赖数组的工作方式。 快速创建数组 let f = length => Array.from ( {length} ) .map (( v , k ) => k ); 进程与线程 一个进程由几个线程组成,进程是资源分配的最小单位,线程是 CPU 调度的最小单位 比如 Chrome 浏览器,可以把每个 tab 看做一个进程,当一个 tab 打开后,会对应开启其内部的线程,如 JavaScript 编译线程、 css 渲染线程、垃圾回收、 service worker 等等 线程快、相互耦合性高,可互通消息

Andriod学习 第十二周

 ̄綄美尐妖づ 提交于 2020-04-05 20:53:45
一、Service 首先我们来了解一下线程的相关概念: 线程 1 相关概念 程序:为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码) 进程:运行中的程序,系统调度与资源分配的一个独立单位,操作系统会 为每个进程分配一段内存空间。程序的依次动态执行,经历代码的加载,执行, 执行完毕的完整过程。 线程:比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个 进程中才能执行,线程由程序负责管理,而进程则由系统进行调度。 多线程的理解:并行执行多个条指令,将CPU时间片按照调度算法分配给各个 线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉到"同时"而已。 2 线程的生命周期 3 创建线程的三种方式 继承Thread类 实现Runnable接口 实现Callable接口 如果使用的是2创建的线程的话,可以直接这样启动: new Thread(myThread).start(); 当更多的时候我们喜欢使用匿名类,即下面这种写法: new Thread(new Runnable(){ public void run(); }).start(); Service与Thread 两者并没有太大的关系,但容易混淆。 Thread是线程,程序执行的最小单元,分配CPU的基本单位, 而Service则是Android提供一个允许长时间留驻后台的一个组件,最常见的

生产环境CPU彪高问题排查方法1(Linux 环境)

给你一囗甜甜゛ 提交于 2020-04-05 19:27:45
1.Linux执行命令top 按C可以按照CPU使用率排序 按c可以看到执行的应用信息 2.top -Hp pid 查看里面那条线程占用CPU 执行 top -Hp 28447 3. 线程id转成16进制 printf "%x\n" 线程id 执行 printf "%x\n" 32750 4.查找关键代码 jstack 进程id|grep 线程id17进制 -A 查看行数 jstack 31997 | grep 7fee -A 200 可以看到占用的代码 本片使用的是Linux 自带命令,后续会有工具使用的方法 还有也可以,使用 jstack 进程号 >> jstack.out 把文件下载到本地在分析 来源: oschina 链接: https://my.oschina.net/u/4039389/blog/3216199