共享模型之无锁
ch6 共享模型之无锁 CAS 与 Volatile 引入的例子 用的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线程安全。 那么它是如何实现的呢? public void withdraw(Integer amount) { while (true) { while (true) { ...
ch6 共享模型之无锁 CAS 与 Volatile 引入的例子 用的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线程安全。 那么它是如何实现的呢? public void withdraw(Integer amount) { while (true) { while (true) { ...
所谓的“线程八锁”,其实就是看 synchronized 锁住的是哪个对象 情况1:12 或 21都是有可能的,就看cpu先调度哪个线程 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { log.debug("1"); } public synchroni...
5 共享模型之内存 共享变量在多线程间的“可见性”问题; 多条指令执行时的“有序性”问题。 Java 内存模型 JMM 即 Java Memory Model,它定义了主存,工作内存抽象概念,底层对应着 CPU寄存器、缓存、硬件内存、CPU 指令优化等。 JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上下文切换的影响; 可见性 - 保证指令不会受...
monitor lock 1 preview 并发之共享模型——管程-悲观锁(阻塞) 共享问题 synchronized 关键字,解决多线程中的并发问题 线程安全分析,知道怎么样的代码编写是线程安全的,哪些有隐患 Monitor,原理分析,管程的底层实现 重要组成部分 wait/notify 也是线程通信的基础 线程状态转换,补充上一章的内容:线程状态 活...
1 创建和运行线程 每个 Java 程序一启动的时候,实际上就有一个线程在运行即主方法线程,默认就有一个主线程在运行了,如果想要在主线程之外再创建线程可以有如下方法。 创建和启动分两步走。 这里有三种方法 继承 Thread 类并重写 run() 方法; 实现 Runnable 接口的 run() 方法; 使用 FutureTask 的方式。 本质上来说只有1种方式:...
1. 进程与线程 1.1 进程 process Q: 什么是进程 ? 进程的定义,一直以来没有完美的标准。 进程是程序的一次执行。应用程序以进程的形式,运行于操作系统之上,享受操作系统提供的服务。 程序由指令和数据组成,指令要运行,数据要读写,则必须将指令加载到 CPU 中,数据加载到内存中。指令运行过程中还需要用到硬盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO...
调优步骤 P192 衡量系统现状 随着系统数据量的不断增长,访问量的不断提升,系统的响应通常会越来越慢,又或是编写的新的应用在性能上无法满足需求,这个时候需要对系统的性能进行调优。调优过程是一个相当复杂的过程,涉及很多的方面:硬件、操作系统、运行环境软件以及应用本身,通常调优的步骤如图所示 调优前首先要做的是衡量系统现状,这包括目前系统的请求次数、响应时间、资源消耗等信息,例如 A ...
Java 代码的执行 源码编译机制 javac 编译源码为 class 文件的步骤 Sun JDK 中采用 javac 将 Java 源码编译为 class 文件,这个过程包含三个步骤: 分析和输入到符号表(Parse and Enter) Parse 过程所做的为词法和语法分析。词法分析(com.sun.tools.javac.parser.Sca...
ch13 线程安全与锁优化 1 线程安全 可操作的定义: 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协作操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。 要求线程安全的代码: 代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无须关心多线程下的调用问题,...
flowchart TD A[ch12 Java 内存模型与线程] A --> A1[概述] A --> A2[硬件的效率与一致性] A --> A3[Java 内存模型] A --> A4[Java 与线程] A --> A5[Java 与协程] A --> A6[ch12 本章小结] 1 概述 Amda...