栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

并发编程之深入理解JMM&并发三大特性(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并发编程之深入理解JMM&并发三大特性(一)

并发编程之深入理解JMM&并发三大特性(一)

前提知识

并发并行 并发三大特性

原子性可见性有序性

前提知识

什么是并发?什么是并行?它们最终的目标是什么?

并发
并发某一时间段内,存在多个任务一起无顺序的交替执行,由于任务与任务之间的切换时间极短用户不容易感知,这种情况叫做并发

并行

并行某一时间段内,多个任务一起执行,这种情况叫并行

最终的目标
最大化CPU使用率 并发三大特性

并发编程BUG的根源就是三大特性:原子性、可见性、有序性

原子性

原子性则是一个操作或者多个操作之间不可被打断,要么都执行,要么都不执行

例如:
		A用户银行转账1000元给B用户
		操作1:A账户-1000元
		操作2:B账户+1000元
  操作1与操作2要么都执行,要么都不执行,中间不能被打断,否则AB账户上的钱则对应不上
可见性

可见性:一个线程对共享变量值的修改,能够及时被其他线程看到

public class Test {
    private static boolean isStop = true;
    private static int count = 0;

    public static void main(String[] args) {
        new Thread(() ->{
            if(isStop){
                while (true){
                    System.out.println(count++);
                }
            }

        },"线程1").start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() ->{
            isStop = false;
        },"线程2").start();
    }
}

上面案例中线程2对共享变量isStop进行修改,线程1对isStop修改后的值应该可见

有序性

有序性:由于java程序是由指令从上到下执行,编译器和处理器会遵守数据依赖性,不会改变存在数据依赖性关系的操作的执行顺序,编译器和处理器在不影响结果的前提下会对指令进行重新排序

public class Test {
    private static boolean isStop = true;
    private static int count = 0;

    public static void main(String[] args) {
        int a = 10;
        int c = 9;
        int b = 5;
        int d = a+b;


        //可能变换成
        int a = 10;
        int b = 5;
        int d = a+b;
        int c = 9;

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/771194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号