【并发编程特性】并发编程特性之五种特性的探讨-volatileandsynchronized
title: 【并发编程特性】并发编程特性之五种特性的探讨
date: 2021-11-18 10:16:05.492
updated: 2021-12-26 17:43:10.414
url: https://www.yby6.com/archives/volatileandsynchronized
categories:
- 并发编程三大特性
tags:
前言
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为何我们还要使用并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得简单,从而极大地简化了复杂系统的开发。
JMM内存图:

一、共享性
- 数据共享性是线程安全的主要原因之一。
- 如果所有的数据只是在线程内有效,那就不存在线程安全性问题,3. 这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。
- 在多线程编程中,数据共享是不可避免的。
- 最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据
二、互斥性
- 资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。
- 我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。
- 所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。
- 如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。
- 对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。
- 但是对共享数据的写操作,一般就需要保证互斥性
三、可见性
线程只能操作自己工作空间中的数据每个工作线程都有自己的工作内存,所以当某个线程修改完某个变量之后,在其他的线程中,未必能观察到该变量已经被修改。如何保证可见性?
一、 使用volatile关键字
1、volatile关键字要求被修改之后的变量要求立即更新到主内存,每次使用前从主内存处进行读取。
2、当修饰引用类型的时候, 只能保证引用本身的可见性, 不能保证内部字段的可见性
二、 使用synchronized加锁
1、synchronization它会保证unlock之前必须先将变量重新刷入主内存当中。
从而达到多个线程确保从主内存当中拿到的数据一致
代码示例:


四、原子性
一、 原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。
二、 示例
X = 5
是一个写操作
具有原子性Y = X
不具有原子性
先把数据X读取工作空间
再把X值写给Y
是一个读写操作, 不具有原子性i++
不具有原子性
读i到工作空间
+1后写到给i
刷新结果到内存a = a + 1
不具有原子性
读a到工作空间
+1
刷新结果到内存
三、如何保证原子性
1. Synchronized
2. JUC Lock加锁
被synchronized关键字或其他锁包裹起来的操作也可以认为是原子的。从一个线程观察另外一个线程的时候,看到的都是一个个原子性的操作。
【并发编程特性】并发编程特性之五种特性的探讨-volatileandsynchronized的更多相关文章
- C#编程高并发的几种处理方法
并发(英文Concurrency),其实是一个很泛的概念,字面意思就是“同时做多件事”,不过方式有所不同.在.NET的世界里面,处理高并发大致有以下几种方法: 1,异步编程 异步编程就是使用futur ...
- 【Java并发编程】并发编程大合集-值得收藏
http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...
- python面试题——网络编程和并发
1.简述 OSI 七层协议. 物理层(电信号.比特流) 基于电器特性发送高低电压(电信号) RJ45.IEEE802.3 数据链路层(数据帧) 定义了电信号的分组方式,分组方式后来形成了统一的标准,即 ...
- 【Java并发编程】并发编程大合集
转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅 ...
- .NET的并发编程(TPL编程)是什么?
写在前面 优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版 .NET 中 ...
- python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
随机推荐
- window 安装多个低版本chrome测试
最近在用next13做一个简单的项目,需要兼容chrome 60+以上版本,为了方便测试,特意在公司的台式机上安装了低版本. 这里简单记录下高版本覆盖低版本的问题,这个方法不影响Windows系统内已 ...
- mpi转以太网连接300PLC无需编程与1200PLC数据交换
300PLC转以太网无需编程300PLC通过 NetDevice与1200PLC数据交换 应用概述: 兴达易控MPI转以太网模块MPI-ETH-XD1.0PLUS 通讯模块实现PLC无需编程通过简单的 ...
- paramiko免密登陆
paramiko免密登陆 # -*- coding: utf-8 -*- import paramiko pkey='D:/pycharm_workspace/testpy/ssh_paramiko_ ...
- 实训——基于大数据Hadoop平台的医疗平台项目实战
文章目录 医疗平台项目描述 数据每列的含义 数据分析业务需求 架构图 成果图 环境搭建 非常感谢各位的认可,最近太多人找我问东问西,故在此进行说明一下: 首先这个是在Linux上基于Hadoop的搭建 ...
- 基于LangChain的LLM应用开发3——记忆
此情可待成追忆,只是当时已惘然.我们人类会有很多或美好或痛苦的回忆,有的回忆会渐渐模糊,有的回忆午夜梦醒,会浮上心头. 然而现在的大语言模型都是没有记忆的,都是无状态的,大语言模型自身不会记住和你对话 ...
- SQL基础应用
SQL基础应用 更多详细内容请查阅:https://www.jianshu.com/p/08c4b78402ff 1.SQL介绍 结构化查询语言 5.7 以后符合SQL92严格模式 通过sql_mod ...
- 子组件emit 父组件方法,成功后回调执行子组件方法
场景: 父组件 update方法 子组件 确定按钮 getlist 刷新列表 子组件点击确定按钮,调用父组件新增接口,新增成功以后,子组件列表刷新 子组件: emit("confirmPa ...
- macbook通过虚拟机连接远程linux
之前操作远程虚拟机,都是用window系统,现第一次用linux命令操作一下linux系统. 苹果启动term 输入ssh root@192.168.3.154连接linux,ssh 用户名@服务器i ...
- 数据结构-线性表-单链表(c++)
线性表的运算 求长度GetLength(L),求线性表L的长度 置空表SetNull(L),将线性表置成空表 按位查找Get(L,i),查找线性表L第i个元素 按值查找Location(L,x),查找 ...
- 关于Linux性能监控之CPU篇详解
http://news.chinaunix.net/opensource/2013/0228/2654519.shtml # vmstat 1 procs -----------memory----- ...