8.volatile原子性

Posted 永恒之心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.volatile原子性相关的知识,希望对你有一定的参考价值。

原子性    

    1.一个操作是不可中断的,即使多个线程在一起执行的时候,一旦操作执行开始,就不会被其他的线程干扰执行并导致执行中断。
    2.对于静态变量int ,2个线程同时对它进行修改,线程a对它修改为10,线程b对它修改为15,a、b线程之间是没有干扰的,最后的结果要么是10或者15。
    3.非原子性操作时,都会存在线程安全问题,所以需要同步技术synchronized使操作变成原子性,一个操作是原子性操作,那么它就具有原子性。
volatile
    1.关键字虽然拥有多个线程之间的可见性,但是却不具有同步性(也就是原子性)。
    2.轻量的(synchronized),性能要比(synchronized)强很多,不会造成线程阻塞(在很多开源的框架中,底层代码都是大量使用volatile)。
    3.volatile用于针对多个线程的变量具有可见性,并不能代替synchronized同步功能。
    
  1. package demo1;
  2. import java.util.concurrent.atomic.AtomicInteger;
  3. /**
  4. * Created by liudan on 2017/7/2.
  5. */
  6. public class MyThread_volatile2 extends Thread{
  7. private static volatile int count;
  8. /*AtomicInteger:使用步长一次性加10*/
  9. private static void addCount(){
  10. for (int i=0;i<1000;i++){
  11. count++;
  12. }
  13. System.err.println(count);
  14. }
  15. @Override
  16. public void run() {
  17. addCount();
  18. }
  19. public static void main(String[] args){
  20. MyThread_volatile2[] myThread_volatile2 = new MyThread_volatile2[10];
  21. for (int i=0;i<myThread_volatile2.length;i++){
  22. myThread_volatile2[i] = new MyThread_volatile2();
  23. }
  24. for (int i=0;i<10;i++){
  25. myThread_volatile2[i].start();
  26. }
  27. }
  28. }
  29. 输出:
  30. 1000 2000 3000 4000 5309 6716 7716 5716 8716 9716





以上是关于8.volatile原子性的主要内容,如果未能解决你的问题,请参考以下文章

编写安全代码:小心volatile的原子性误解

原子片段:原子编辑器中的多行片段

JUC并发编程 共享模型之内存 -- Java 内存模型 & 原子性 & 可见性(可见性问题及解决 & 可见性 VS 原子性 & volatile(易变关键字))(代码

并发研究之可见性有序性原子性

并发编程三要素:原子性,有序性,可见性

小知识点记录: 可见性与原子性