并行与并发

并行和并发都是为了提高CPU使用率,前者在同一时刻多条指令在多处理器上同时执行,而并发在单处理器系统中通过快速切换指令执行实现宏观上的同时执行。并发的三大特性包括可见性、有序性和原子性,Java中可通过volatile、synchronized、Lock等机制保证这些特性。
摘要由CSDN通过智能技术生成

并行与并发

并行并发的目的都是最大化CPU使用率。

并行

同一时刻,有多条指令在多个处理器(CPU)上同时执行,无论从微观还是从宏观上来看,二者都是一起执行的。

并发

同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使得多个进行快速交替的执行

并行在多处理器系统中存在,而并发可以在单个处理器和多个处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作,每个小时间片执行一个操作,多个操作快速切换执行。

并发三大特性

可见性

当一个线程修改了共享变量的值,其他线程能够看到修改后的值。在Java内存模型中,通过变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量的值,Java内存依赖主内存作为传递媒介的方法来实现可见性。

可见性保障方案:

  • 通过volatile关键字保障可见性。

  • 通过内存屏障保障可见性。

  • 通过synchronized关键字保障可见性。

  • 通过Lock保障可见性。

  • 通过final关键字保障可见性。

package com.warrior.juc.threadbase;

/**
 * @Author warrior
 * <p>
 * 可见性demo案例
 */
public class VisibilityDemo {

    //线程B看不到线程A修改后的共享变量值
//    private boolean flag = true;

    private volatile boolean flag = true;

    public static void main(String[] args) throws InterruptedException {
        VisibilityDemo visibilityDemo = new VisibilityDemo();

        //线程A加载数据
        Thread threadA = new Thread(() -> visibilityDemo.load(),"threadA");
        threadA.start();

        //让线程A执行一会儿
        Thread.sleep(1000);

        //线程B修改flag值,控制线程A的执行时间
        Thread threadB = new Thread(() -> visibilityDemo.refresh(),"threadB");
        threadB.start();

    }

    public void refresh() {
        flag = false;
        System.out.println(Thread.currentThread().getName() + "修改了flag值");
    }

    public void load() {
        System.out.println(Thread.currentThread().getName() + "开始执行......");
        int i = 0;
        while (flag) {
            //TODO 执行业务逻辑
            i++;

        }
        System.out.println(Thread.currentThread().getName() + "跳出循环:i=" + i);
    }
}
有序性

程序执行的顺序按照代码的先后顺序执行,JVM存在指令重排,所以存在有序性问题。

有序性保障方案:

  • 通过volatile关键字保障有序性。

  • 通过synchronized关键字保障有序性。

  • 通过Lock保障有序性。

原子性

一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。在Java中,对基本数据类型变量的读取和赋值操作都是原子性操作(64位处理器)。不采取任何的保障原子性措施的自增操作并不是原子性的。

原子性保障方案:

  • 通过synchronized关键字保障原子性。

  • 通过Lock保障原子性。

  • 通过CAS保障原子性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值