线程安全和对应的核心概念
线程安全
- 线程安全的概念:当多个线程访问某一个类(对象和方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或者方法)就是线程安全的
- synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为‘互斥区’或者“临界区”
- 当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排队是按照CPU分配的先后顺序而定的),一个线程想要实现synchronized装饰的方法里的代码,首先是尝试获取锁,如果可以得到锁,就可以执行synchronized代码体的内容;如果拿不到锁,这个线程就会不断尝试去获取锁资源,直到拿到为止;而且是多个线程同时去竞争这把锁(锁竞争)
Synchronized
- 同步Synchronized:同步的概念就是共享,如果不是共享的资源就没有必要进行同步
- 异步asynchronized:异步的概念就是独立,相互之间不受到任何制约
- 同步的目的是为了保证线程的安全,对于线程安全需要保证两个特性 原子性(同步)和可见性
线程之间通信
- 线程通信的概念:线程是操作系统中独立的个体,但是这些个体如果不经过特殊的处理就不能成为一个整体,线程之间的通信就成为整体的必用的方式之一。当线程之间存在通信指挥,系统之间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对于线程任务在处理过程中,进行有效的把控和监督
- 使用wait/notify方法实现线程之间的通信(这两个方法都是object的类的方法,即java为所有的对象都提供了这两个方法)
- wait和notify必须配合synchronized关键字使用
- wait方法释放锁/notify方法不释放锁
ThreadLocal概念
- 线程局部变量,是一种多线程间并发访问变量的解决方案,与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程的安全
- 从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的情况下,加锁的性能可能会更好,但是作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争
Volatile关键字核心概念与应用
- Volatile:主要作用是使变量在多个线程之间可见
- 阻止指令的重排序,happens-before
- 一个线程可以执行的操作有使用(use)、赋值(assign)、转载(load)、存储(store)、锁定(lock)、解锁(unlock)
- 主内存可以执行的操作有读(read)、写(write)、锁定(lock)、解锁(unlock),每个操作都是原子的
- volatile的作用就是强制线程到主内存(共享内存)里去读取变量,而不是去线程工作内存里去读取,从而实现了多个线程之间变量的可见,也就是满足线程安全的可见行
JVM
- Java Memory Model(Java内存模型),简称JVM,用于解决线程对于共享变量的写入何时对于另一个线程可见
- 所有变量都存储在主内存中,每一个线程都有一个私有的本地内存,本地内存是将该线程使用到的变量,从主内存中拷贝到本地
- 线程对于变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量也不例外)
- happens-before规则,例如操作A :i=1;操作B:j=i;如果操作Ahappens-before操作B,那么操作B完成之后,j的值一定为1;
- 因为happens-before关系可以向程序员保证,在操作B执行之前,操作A的执行后的影响【或者说明结果】(修改i的值)对于操作B是可以观察到的【可见的】
规则
- 简而言之,使用happens-before概念来阐述操作之间的内存可见行
- 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作,也就是说,你写的操作,如果是单线程执行,那么前面的操作就会happens-before于后面的操作
- 监视器锁规则:对于一个锁的解锁,happens-before于随后对这个锁的加锁
- Volatile变量规则:对于一个volatile域的写,happens-before于任意后续对这个volatile域的读
- 传递性规则:A happens-before B,B happens-before C,则A happens-before C
指令重排序
- 为了保证程序的最终运行结果需要和在单线程严格意义的顺序化环境下执行的结果一致,程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令的重排序
- 指令的重排序的意义:JVM利用处理器的特性,充分利用多级缓存,多核等进行适当的指令重排序,从而可以充分利用CPU的执行特点,最大程度上发挥机器的性能
Atomic系列类比
- Atomic系列类封装了一系列的基础类型和对象操作,其目的是为了实现原子性
- AtomicInteger
- AtomicLong
- AtomicBoolean
- AtomicIntegerArray
- AtomicLongArray
- AtomicReference
- 注意:在对Atomic类操作的时候,如果有多个操作执行,那么就是非原子性的,需要加aynchronized进行修饰,保证Atomic类操作的整体原子性
线程安全和对应的核心概念相关推荐
- 02 线程简介 多任务 多线程 普通方法调用和多线程 程序.进程.线程 Proces与Thread 核心概念
线程简介 任务,进程,线程,多线程 多任务 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务 多线程 原来是一条路,慢慢因为车太多了,道路堵塞,效率极低. 为了提高使用的 ...
- 《Spark大数据分析:核心概念、技术及实践》大数据技术一览
本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1节,作者穆罕默德·古勒(Mohammed Guller)更多章节内容可以访问云栖社区"华章 ...
- nacos 本地测试_微服务架构系列之Nacos 配置核心概念
上次讲了<微服务架构之Nacos配置中心之配置MySQL数据库>,本次讲述Nacos 配置核心概念.原作者:哈喽沃德先生,谢谢关注哈喽沃德先生. 1.配置 为什么需要配置?概念. 在系统开 ...
- Kafka:Kafka核心概念
1 消息系统简介 1.1 为什么要用消息系统 ? 解耦 各位系统之间通过消息系统这个统一的接口交换数据,无须了解彼此的存在: 冗余 部分消息系统具有消息持久化能力,可规避消息处理前丢失的风险: 灵活性 ...
- 学习笔记Flink(二)—— Flink数据流模型、时间窗口和核心概念
一.Flink编程数据流模型 1.1.Flink – API封装 Flink 提供不同级别的API封装来支持流/批处理应用程序. 1.2.Flink-编程数据流 Source:一个不会结束的数据记录流 ...
- cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念
cnn卷积神经网络应用 In this tutorial, we'll work through the core concepts of convolutional neural networks ...
- 并发、并行、线程、进程与CPU基本概念
转载自: https://blog.csdn.net/qq_21480607/article/details/100135524 首先我们需要了解一些基础概念: 串行,并发与并行 串行 多个任务,执行 ...
- rocketmq 顺序消费_RocketMQ核心概念扫盲
在正式进入RocketMQ的学习之前,我觉得有必要梳理一下RocketMQ核心概念,为大家学习RocketMQ打下牢固的基础. 1.RocketMQ部署架构 在RocketMQ主要的组件如下: Nam ...
- 深度揭秘腾讯云新一代企业级HTAP数据库TBase核心概念
腾讯云PostgreSQL-XZ(PGXZ)经过公司内部多年业务的打磨,在2017年改名为TBase后,正式对外推出,目前已在政务.医疗.公安.消防.电信.金融等行业等行业的解决方案中大量应用.TBa ...
最新文章
- caffe web demo 搭建
- 总结:C#中跨窗体传值的几种方法
- java soap 头_如何将java头添加到java中的soaprequest
- 用c语言get统计字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- 张陈斌计算机控制工程,计算机控制讲稿--4.pdf
- 深圳当代艺术家的一次聚会
- instagram架构_如何为亚马逊,Instagram,Zalando和天猫生成产品图像
- Anaconda——复制Conda的虚拟环境
- 零基础自学用Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha...
- struts2 - View页面中获取Action的成员变量
- ROBOTSTXT_OBEY
- 【算法笔记】输出st-en的所有路径(DAG--dfs)
- Unity中的文件夹和路径
- C语言 Mkl 矩阵乘法,MKL库矩阵乘法
- velocity模板使用手册
- Excel:把数据生成曲线图
- Spring Cloud GateWay-过滤器
- Spring学习总结01--Spring了解,IOC,DI
- 2022最新高通8155平台开源代码最新代码下载、编译方法
- 一个几乎对英语零基础的人,该如何有效,且高效的学习英语?
热门文章
- 【转】应用架构之道:分离业务逻辑和技术细节
- 2.1Dynamics 365 安装问题——无法访MSCRM_CONFIG数据库
- jQuery Ajax 如何设置Timeout
- 一步步编写操作系统 77 内联汇编与ATT语法简介
- 《线性代数的几何意义》笔记(1)
- REVERSE-PRACTICE-BUUCTF-16
- CCNA-第十五篇-DHCP配置+SDN介绍(最后一章)
- 【LeetCode - 131】分割回文串(dp,dfs)
- 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)
- 使用tcpdump,adb进行手机抓包