并发编程之深入理解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;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值