基本概念

并行与并发

并行:单位时间内多个任务同时执行(多核CPU)。

并发:同一时间段内多个任务同时都在执行(CPU时间片轮转)。

线程安全性问题

线程安全问题:指多个线程同时读写一个共享资源而没有同步措施时,导致出现脏数据或其他不可预见结果的问题。

保证线程安全方法:线程同步。

内存可见性问题

主内存:真正的内存。

工作内存:各级缓存,以及CPU的寄存器。

共享变量内存不可见问题:

例:线程A和线程B同时处理一个共享变量,由于缓存的存在,会导致内存不可见问题:

A写变量X=1 =>线程A所在的CPU的两级Cache和主内存里面X=1;

B读变量X =>线程A所在的CPU的两级Cache里面X=1;

B写变量X =>线程B所在的CPU的两级Cache和主内存里面X=2;

A读变量X =>由于线程A所在的CPU缓存中有X,所以读到X=1,是错误的。

synchronized与volatile关键字

一、 synchronized

synchronized是Java语法中的一个内置锁的实现。synchronized关键字解决了代码块或者方法上的同步问题,同一时间,只有一个线程能够通过并执行。保证线程安全:内存可见性和原子性提供了并发场景的一个共享资源访问的解决方案。

当我们说synchronized锁住的是一个JVM对象时,真正发挥作用的是对象头上所指向的monitor对象(监视器机制:Java锁的底层实现)。

synchronized有两种作用域:方法或代码块

1.作用域为方法:这种作用域下,锁住的对象为this,也就是当前对象;如果方法是静态的,锁住的是当前的Class类对象。

public synchronized void synchronizeMethod() {
// do sth
}

2.作用域为代码块:锁住的对象为synchronized之后指定的对象,下例中即为resource。

public static void main() {
synchronized(resource) {
// do sth
}
}

在真正执行的时候,两者都是会去获取底层monitor锁(监视器锁)执行。

二、volatile

volatile只能够用于修饰变量。

它能够保证的是,变量在程序执行过程中的可见性和有序性,它不能保证变量的原子性。

1、可见性,但不保证原子性:

第一,被volatile修饰的变量,一旦有修改,会立即刷新到主内存里面。

第二,被volatile修饰的变量,一旦被一个线程修改了,其他线程马上就能够读到这个变量修改后的值(即与主内存同步)。

它不能保证变量的原子性。它只是保障了变量在读/写操作的时候,具有原子性,但是无法保证变量在任何操作的时候是原子的。例如,在多线程的场景下,一旦有多个线程同时来执行i++,即使是使用volatile修饰的变量i,也是无法保证i++执行的正确性,因为涉及到读+写。

2、有序性:

关键在于多个内存读写操作有没有被CPU硬件以及编译器软件调换顺序。

以如下代码段为例,

//线程A
1. succ=false
2. i=10
3. doSomething()
4. i=20
5. succ = true // 线程B
6. if (succ) {
7. doSomethingB();
8. }

若succ未用volatile修饰,则可能的执行顺序为15234,succ提前置为true可能会造成线程B出现问题。

若succ使用volatile修饰,就会严格按照步骤1,中间步骤24,步骤5,来执行,这里面的中间步骤24顺序究竟如何,不用去管,但是它一定会等到中间步骤都执行完毕才去执行最后一个步骤。这就是volatile所保证的有序性。

三、synchronized与volatile关键字的理解

  • synchronized和volatile都是用于解决线程同步问题的java关键字,它们都能够一定程度上解决资源在多线程场景下的同步问题,单线程场景下,它们的优势发挥不出来,只能增加性能负担。
  • synchronized是一个重量级相对较高的锁操作,它占用的资源更多,性能更低,但是在多线程环境下更为安全,能够保证某段代码块只能只能够串行执行。其背后的原理,是Java利用Monitor锁机制,来实现对线程调度的控制。
  • volatile则是一个轻量级的操作,性能相对较好,但是性能要好上多少需要根据具体情况具体分析;它只能保证变量的可见性以及在代码执行中的有序性,并不能保障操作的原子性,也不能保证线程安全。
  • 使用volatile的场景:写入变量值不依赖变量的当前值。因为如果依赖当前值,则需要保证读+计算+写的原子性。

四、参考链接

https://bbs.byr.cn/#!article/Java/63393

[Java并发编程之美]第2章 并发编程的其他基础知识 补充知识的更多相关文章

  1. Java高级程序设计笔记 • 【第4章 网络编程】

    全部章节   >>>> 本章目录 4.1 网络基础知识 4.1.1 IP地址 4.1.2 端口号 4.1.3 使用InetAddress 4.1.4 InetAddress 类 ...

  2. 《Clojure编程》笔记 第2章 函数式编程

    目录 背景简述 第2章 函数式编程 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的.坊间传闻:通常情况下,最好是有一定Jav ...

  3. [Java并发编程之美]第1章 线程基础

    第1章 线程 1.1 线程与进程 进程是操作系统资源分配和调度的基本单位,但cpu资源是分配到线程的,也就是线程是CPU分配的基本单位. 线程自己的栈资源中,存放的局部变量是线程私有的,其他线程无法访 ...

  4. [Java并发编程之美]第1章 线程基础 补充知识

    1.2线程创建与运行 创建线程有三种方式: 继承Thread类并重写run方法: 实现Runnable接口的run方法,new Thread时将该类对象作为参数传入: 实现Callable接口的cal ...

  5. [Java并发编程之美]第2章 synchroized关键字

    ###synchronized关键字 synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用.线程在进入synchronized块钱会自动获取内部锁,这时候其他线程 ...

  6. java科学和艺术语言 第六章 课后编程

    家转载,为保留作者成果.转载请注明出处,http://blog.csdn.net/netluoriver,有些文件在资源中也能够下载!假设你没有积分,能够联系我索要. 1. package Sixth ...

  7. MySQL高级查询与编程笔记 • 【第4章 MySQL编程】

    全部章节   >>>> 本章目录 4.1 用户自定义变量 4.1.1 用户会话变量 4.1.2 用户会话变量赋值 4.1.3 重置命令结束标记 4.1.4 实践练习 4.2 存 ...

  8. 《Clojure编程》笔记 第3章 集合类与数据结构

    目录 背景简述 第3章 集合类与数据结构 3.1 抽象优于实现 3.1.1 Collection 3.1.2 Sequence 3.1.3 Associative 3.1.4 Indexed 3.1. ...

  9. 编程之美之数独求解器的C++实现方法

    编程之美的第一章的第15节.讲的是构造数独.一開始拿到这个问题的确没有思路, 只是看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的. 可是不知道为啥,反正一開始确实没有想到这个回溯法. ...

随机推荐

  1. 解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题

    我们都知道使用Springmvc的ajax很强大只要三步就可以实现: 1.引入jackson的maven到pom文件: <dependency> <groupId>com.fa ...

  2. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  3. 【Spring】Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!

    写在前面 很多小伙伴私聊我说:最近他们公司的业务涉及到多个数据源的问题,问我Spring如何实现多数据源的问题.回答这个问题之前,首先需要弄懂什么是多数据源:多数据源就是在同一个项目中,会连接两个甚至 ...

  4. 操作系统-存储管理(3)高速缓存Cache

    存储器的组织形式: 数据总是在相邻两层之间复制传送,最小传送单位是定长块,互为副本(不删除) ️指令和数据有时间局部性和空间局部性.   高速缓冲存储器Cache 介于CPU和主存储器间的高速小容量存 ...

  5. lammps_data文件

    一.notes: 1.不在data文件里写“#”(注释),否则,容易出错: 2.前两行不用写东西(建议): 3.相互作用系数可以不用写在data里边(如pair_coeff等),可有可无,but fo ...

  6. ominigraffle实践之画精美流程图+自动导出Xcode工程类图

    背景 在平常阅读各种文章时,注意到有的文章中流程图做得特别漂亮.特别羡慕.于是去搜索了下,发现mac平台好评很高的是一款名为ominigraffle的软件.这款软件不仅可以画图,还可以导出Xcode工 ...

  7. 区块链入门到实战(25)之以太坊(Ethereum) – 以太币单位

    以太币的主要单位是以太/Ether,即一个以太币,以太币的最小单位是wei. 以太币最小单位 wei 是以虚拟币先驱人物:戴伟 Wei Dai 命名,戴伟 W Dai 是一位兴趣广泛的密码学专家,他在 ...

  8. MPI自定义数据类型

    自定义数据类型 1.数据类型辅助函数 MPI_Type_commit int MPI_Type_commit( MPI_Datatype *datatype ); 在通信中使用数据类型对象之前,必须提 ...

  9. AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)

    题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...

  10. 初识ABP vNext(7):vue身份认证管理&租户管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ...