美文网首页
多线程原子性和可见性

多线程原子性和可见性

作者: xandone | 来源:发表于2017-04-13 11:47 被阅读191次

简单的说就是:
  原子性,不被线程调度器中断的操作,同一时间只有一个线程进行操作,若存在多个线程同时操作的话,就存在线程安全的因素了,是非原子性的。synchronized为一段操作或内存进行加锁,它具有互斥性。当线程要操作被synchronized修饰的内存或操作时,必须首先获得锁才能进行后续操作;但是在同一时刻只能有一个线程获得相同的一把锁,保证了线程安全,相当于将非原子性操作转化为了原子性。
  可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,操作状态多线程之间互相可见。
举个简单的例子:
  多线程并发操作count++,
cup的执行过程是:
1.将count值从内存加载到cup的寄存器A(备份过程);
2.将A中的count值+1(计算),将A中的count计算结果值存放到寄存器B(缓存区);
3.在某些“恰当的”时刻,cup将寄存器B中的count值写回到内存
(注:这样做的好处是减少对内存的读取,提高执行效率)
那么,并发状态下,count值在A中的计算结果在写入内存之前,止步于缓存区状态,各线程之间不能获取其他线程的操作结果,这是不可见性。
  关键字volatile修饰count,执行上述操作:
1.将count值从内存加载到cup的寄存器A(备份过程);
2.将A中的count值+1(计算),将A中的count计算结果值存放到寄存器B(缓存区);
3.将寄存器中的count值写回到内存(同步执行)。
count值在A中的计算结果同时写入缓存区和内存中,各线程之间能获取其他线程的操作结果,这是可见性。
  但是这种情况,依然存在线程安全问题,多线程并发操作获取内存中的count值可能相同(计算结果还未写入内存),多线程同时执行计算,即使计算多次,依然相当于就算了一次,这是非原子性。

相关文章

  • Java 复习笔记

    线程和进程的关系? 多线程 原子性、可见性、有序性 1.ThreadLocal 2.volatile 3.CAS ...

  • 3. 并发终结之三大特性

    线程安全问题概括的说表现为3个方面:原子性、可见性和有序性 原子性 原子操作是多线程环境下的一个概念,它是针对共享...

  • Java 并发系列(一)多线程三大特性:原子性、可见性、有序性

    概述 多线程三大特性:原子性、可见性、有序性。 1. 原子性 原子性是指:多个操作作为一个整体,不能被分割与中断,...

  • 多线程原子性和可见性

    简单的说就是:原子性,不被线程调度器中断的操作,同一时间只有一个线程进行操作,若存在多个线程同时操作的话,就存在线...

  • volatile#synchronized

    可见性原子性有序性 多线程三原则 volatile(不能修饰局部变量) 并发中存在可见性问题,volatile可以...

  • volatile关键字

    1、概述 volatile保证多线程下变量可见性和有序性的问题,不保证原子性。 volatile不是并发安全的,因...

  • Java多线程

    01 |可见性、原子性和有序性问题:并发编程Bug的源头 原子性:线程切换导致原子性。 可见性:CPU缓存导致可见...

  • 10-同步机制的其它作用

    同步机制的其它作用:原子性、可见性和有序性 synchronized和Lock不仅可以确保原子性、可见性还可以确保...

  • java基础18-并发学习

    1.并发问题:可见性,原子性和有序性 cpu缓存会导致可见性,线程切换会导致原子性(count++不是原子的),编...

  • 浅谈java高并发

    JMM JMM是java的内存模型,JMM的关键技术就是围绕着多线程的原子性,可见性,有序性来建立的。 1.原子性...

网友评论

      本文标题:多线程原子性和可见性

      本文链接:https://www.haomeiwen.com/subject/uxhbattx.html