码迷,mamicode.com
首页 > 其他好文 > 详细

并发编程中的三个问题

时间:2020-07-08 23:04:57      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:情况下   get   star   except   bsp   class   flag   lis   seconds   

并发编程中的三个问题

可见性

  概念:可见性(Visibility)指一个线程对共享变量进行修改,另一个立即得到修改后的最新值;

package juc.synchronized_test;
?
import java.util.concurrent.TimeUnit;
?
/**
 * @author : 雪飞oubai
 * @date : 2020/4/9 11:07
 * 目的:演示可见性问题
 *      1、创建一个贡献变量
 *      2、创建一条线程不断的读取共享变量
 *      3、创建一条线程修改共享变量
 */
public class Test01Visibility {
    // 多个线程都会访问的数据,我们称为线程的共享数据
    private static boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
       new Thread(() -> {
           while(flag){
?
           }
       }).start();
?
        TimeUnit.SECONDS.sleep(1);
?
        new Thread(() -> {
            flag = false;
            System.out.println("时间到,线程2设置为false");
        }).start();
    }
}

 


原子性

  概念:原子性(Atomicity)在一次或多次操作中,要么所有的操作都执行并且不会受其它因素影响,要么所有的操作都不执行;

package juc.synchronized_test;
?
import java.util.ArrayList;
import java.util.List;
?
/**
 * @author : 雪飞oubai
 * @date : 2020/4/9 11:27
 * 目标:演示原子性问题
 * 1、定义一个共享变量 number
 * 2、对number进行10000次 ++ 操作
 * 3、使用 5 个线程来进行
 */
public class Test02Atomicity {
    //1、定义一个共享变量 number
    private static int number = 0;
?
    public static void main(String[] args) throws InterruptedException {
        Runnable increment = () -> {
            for (int i = 0; i < 10000; i++) {
                number++;
            }
        };
        List<Thread> list = new ArrayList<>();
?
        for (int i = 0; i < 5; i++) {
            Thread t = new Thread(increment);
            t.start();
            list.add(t);
        }
        for (Thread thread : list) {
            thread.join();
        }
        System.out.println("number="+number);
    }
}

 

其中,对于 number ++ 而言(number为静态变量),实际会产生如下的JVM字节码指令

技术图片

 

 

由此可见 number++ 是由多条语句组成,以上多条指令在一个线程的情况下不会出现问题,但是再多线程情况下就可能会出现问题。比如一个线程在执行 13:iadd时,另一个线程又执行 9:getstatic,会导致两次number++,实际上只会加一次;

小结

  并发编程会出现原子性问题,当一个线程对共享变量操作到一半时,另外的线程也有可能来操作共享变量,干扰了前一个线程的操作;

有序性

  概念:有序性(Ordering)是指程序中代码的执行顺序,Java在编译时和运行时会对代码进行优化,会导致程序最终的执行顺序不一定就是我们编写代码时的顺序;

 

并发编程中的三个问题

标签:情况下   get   star   except   bsp   class   flag   lis   seconds   

原文地址:https://www.cnblogs.com/lililixuefei/p/13269610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!