当前位置:网站首页>并发三大性质
并发三大性质
2022-07-26 10:55:00 【qq_547026179】
1. 原子性
一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
- 例如:a++;这个操作其实分成以下3步进行:
(1)读取a的值;
(2)将a的值加1;
(3)将加1后的值赋给a;
在多个线程同时操作这条语句的时候,如果A线程刚对a变量进行+1操作后还没来得及重新赋值给a,就被B线程读取到了a的值然后进行了+1的操作,那么A线程并没有完全执行完这3步操作就被B线程读取了这个变量,就不能保证原子性了。 - 如何保证原子性
(1)通过 synchronized 关键字定义同步代码块或者同步方法保障原子性。
(2)通过 Lock 接口保障原子性。
(3)通过 Atomic 类型保障原子性。
2. 可见性
一个线程对共享变量的修改,能够及时的被其他线程看到。
- 共享变量
如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。 - Java内存模型
Java内存模型(Java Memory Model)描述了Java程序中各种变量(共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层信息。
(1)所有的变量都存储在主内存中;
(2)每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本。
(3)每个线程对共享变量的操作都必须在自己的工作内存中进行,不能直接从主内存中读写。
(4)不同线程之间无法直接访问彼此工作内存中的变量,不同线程间变量值的传递需要通过主内存来完成。
- 可见性实现原理
(1)把线程中修改的变量值先更新到该线程独立的工作内存中,再将工作内存中的值刷新到主内存中。
(2)主内存再将最新的共享变量的值刷新到其他工作内存中。 - 如何保证可见性
(1)通过 synchronized 关键字定义同步代码块或者同步方法保障可见性。
(2)通过 volatile 关键字标记内存屏障保证可见性。volatile 的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但是volatile 不能保证原子性。
(3)通过 Lock 接口保障可见性。
(4)通过 Atomic 类型保障可见性。
(5)通过 final 关键字保障可见性
3. 有序性
即程序执行的顺序按照代码的先后顺序执行。
- 不过处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。 例如:
int i=1;//语句1
int j=2;//语句2
在执行时,有可能对代码进行重排序,比如先执行语句2,再执行语句1。但是如果代码,编程下边这样:
int i=1;
int j=2;
j++;//语句3
i=j+1;//语句4
这时,语句3和语句4并不会进行重排序。因为语句3和4之间有依赖关系,重排序后会影响结果。
但是在多线程的情况下,就可能会出错。例如:
boolean flag=false;
private int i=1;
//线程1
i += 1;//语句1
flag=true;//语句2
//线程2
if(flag){
j += i;
}
如果线程1执行的时候,语句1和语句2进行了重排序,先执行语句2,在还没有执行语句1时,这时线程2 将要执行if,那么就会进入到if语句块中,这时候j的值就会出错。 - 如何保证有序性
(1)通过 synchronized 关键字通过一个变量在同一时刻只允许一条线程对其进行lock操作来保证其线程访问的有序性。
(2)可以用volatile关键字,禁止被它修饰的变量发生指令重排操作。是通过内存屏障去完成的禁止指令重排序。
边栏推荐
- 菜鸟看源码之ArrayList
- Sword finger offer (52): regularization expression
- c结构体中定义的成员指针赋值与结构体指针作为成员函数参数的使用
- MySQL quick learning notes-2021-08-31
- Fragment 懒加载
- Wechat official account message notice "errCode": 40164, "errmsg": "invalid IP
- Pytest execution rules_ Basic usage_ Common plug-ins_ Common assertions_ Common parameters
- 2021-08-13 learn C language with pengge - array
- pytest 用例执行顺序
- Pre post pytest method
猜你喜欢

使用Selenium抓取zabbix性能监控图

@Notblank, @notnull, @notempty differences and uses

Bash shell学习笔记(六)

ArrayList of novice source code

实时流式协议--RTSP

Wechat official account message notice "errCode": 40164, "errmsg": "invalid IP

Pre post pytest method

菜鸟看源码之HashTable

Classified by the number of 1 in binary number

ThreadPoolExecutor是怎样执行任务的
随机推荐
微信公众号开发 获取openid时报错40029 invalid code 问题的解决
Shape matching Halcon template
菜鸟看源码之HashTable
Many people don't know whether they are looking for Kanban software or Kanban software
104. Maximum depth of binary tree
pytest fixture装饰器
Sword finger offer (49): convert a string to an integer
logging 高级使用
SCADA和三大工业控制系统PLC、DCS、FCS
菜鸟看源码之SparseArray
@Notblank, @notnull, @notempty differences and uses
Bash shell学习笔记(七)
Logging learning final edition - configured different levels of log printing colors
2021-08-14 Sanzi chess
Fragment 懒加载
Basic use of logging
35. 搜索插入位置
mother
数据可视化-《白蛇2:青蛇劫起》(2)
Wireshark basic tutorial Ethernet frame analysis.