首页 > 其他分享 >【多线程总结(四)-三大性质总结】

【多线程总结(四)-三大性质总结】

时间:2022-10-17 12:03:21浏览次数:69  
标签:总结 变量 synchronized 可见 volatile 有序性 线程 多线程 三大


前言

在并发编程中分析线程安全的问题时三条性质:原子性,有序性和可见性往往是非常重要的,本篇博客主要来用synchronized和volatile关键来进行对比。首先来看看宏观导图

【多线程总结(四)-三大性质总结】_有序性

核心

原子性

原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败。首先来synchronized

尽管jvm没有把lock和unlock开放给我们使用,但jvm以更高层次的指令monitorenter和monitorexit指令开放给我们使用,synchronized关键字满足原子性

volatile是不满足原子性的.

如果让volatile保证原子性,必须符合以下两条规则:

  1. 运算结果并不依赖于变量的当前值,或者能够确保只有一个线程修改变量的值;
  2. 变量不需要与其他的状态变量共同参与不变约束

有序性

synchronized语义表示锁在同一时刻只能由一个线程进行获取,当锁被占用后,其他线程只能等待。因此,synchronized语义就要求线程在访问读写共享变量时只能“串行”执行,因此synchronized具有有序性

volatile

在java内存模型中说过,为了性能优化,编译器和处理器会进行指令重排序;也就是说java程序天然的有序性可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序的。而用volatile修饰的话就操作重排序,从而避免这种情况。volatile包含禁止指令重排序的语义,其具有有序性

可见性

可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。synchronized,当线程获取锁时会从主内存中获取共享变量的最新值,释放锁的时候会将共享变量同步到主内存中。从而,synchronized具有可见性。同volatile,会通过在指令中添加lock指令,以实现内存可见性。因此, volatile具有可见性

总结

通过前面的总结,再次将synchronized和volatile总结:

synchronized: 具有原子性,有序性和可见性volatile:具有有序性和可见性

 

标签:总结,变量,synchronized,可见,volatile,有序性,线程,多线程,三大
From: https://blog.51cto.com/u_15586641/5762063

相关文章

  • 9.5 模拟赛总结
    2021.09.05不知为何没点发布。根据昨天发生的状况,开考赶紧先把题都看了一遍,还好,都能看懂。\(T1\)的式子推了好半天,没推出来啥结论,于是把所有题的部分分都想了一下。\(T......
  • 多线程-匿名内部类方式实现线程的创建
    使用线程的匿名内部类方式可以方便的实现每个线程执行不同的线程任务操作匿名:没有名字内部类:写在其他类内部的类匿名内部类作用:简化代码把子类继承父类重写父......
  • 多线程-线程安全前篇
    线程安全如果有多个线程在同时运行而这些线程可能会同时运行这段代码程序每次运行结果和单线程运行的结果是一样的而且其他的变量的值也和预期的是一样的就像线程安......
  • 多线程-线程安全-同步代码块
    线程安全问题产生的原理出现了线程安全问题卖票出现了重复的票图解 线程同步当我们使用多个线程访问同一个资源的时候且多个线程对资源有写的操作就容易出现线......
  • 多线程-线程安全-同步方法
    同步方法使用synchronized修饰的方法就叫做同步方法保证A线程执行该方法的时候其他线程只能在方法外等着格式:publicsynchronizedvoidmethod(){可能......
  • 多线程-线程安全问题-lock锁
    lock锁lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作同步代码块/同步方法具有的功能lock都有除此之外更强大更体面面向对象lock隶属于jav......
  • 多线程-并发和并行和线程与进程
    并发和并行并发:指两个或者多个事件在同一个时间段内发生并行:值两个或者多个事件在同一时刻发生(同时发生) 更详细的图解:线程和进程进程基本介绍是指一个内存中运......
  • 多线程—线程
    线程的概念cpu:中央处理器对数据进行计算指挥电脑中的软件和硬件干活cpu的分类AMDInterInterCore(核心)i788664核心8线程8线程:同时执行8个任务图解: ......
  • 多线程-创建线程类
    java使用Thread类代表线程所有线程对象都必须时Thread类或者其子类的实例每个线程的作用是完成一定的任务实际上就是执行一段程序流即一端顺序执行的代码java使用线程......
  • Java基础面试总结
    常见编译型语言:C、C++、Go、Rust等(执行速度快,但开发效率低)常见解释型语言:Python、JavaScript、PHP(开发效率高,但执行效率低)先编译后解释:Java重载和重写有什么区别?重载......