并发编程-第一章 并发编程的挑战

时间:2021-04-17
本文章向大家介绍并发编程-第一章 并发编程的挑战,主要包括并发编程-第一章 并发编程的挑战使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

并发编程的目的:

提高程序的响应速度
充分利用计算机资源

一、上下文切换

现代CPU使用时间片轮转法来进行线程的调度,给每个线程分配固定的时间片,当一个线程时间片用完,就要保存当前线程状态信息,执行其他线程,当再次调度到该线程时,加载线程状态信息,继续执行。

一次上下文切换 = 保存线程状态信息 + 加载线程状态信息

1.1 上下文切换对性能是否存在影响?

从理论上来说,上下文切换会影响程序的执行速度;

1.2 怎么知道发生了上下文切换?

测量上下文切换的时长: Lmbench
测量上下文切换的次数: vmstat

1.3 如何减少上下文切换?

  • 无锁并发编程
  • CAS 算法
  • 使用最小线程
  • 使用协程

二、死锁

一个线程正在请求获取一个永远获取不到的锁。
例如:

    public static final String lock1 = "lock1";
    public static final String lock2 = "lock2";

    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new Thread(() -> {
            synchronized (lock1) {
                System.out.println("线程A获取 lock1 锁");
                synchronized (lock2) {
                    System.out.println("线程A获取 lock2 锁");
                }
            }
        });
        Thread threadB = new Thread(() -> {
            synchronized (lock2) {
                System.out.println("线程B获取 lock2 锁");
                synchronized (lock1) {
                    System.out.println("线程B获取 lock1 锁");
                }
            }
        });
        threadA.start();
        threadB.start();
    }

2.1 如何避免死锁?

  • 避免一个线程获取多个锁
  • 尽量一把锁一个资源
  • 使用带计时器的锁
  • 对于数据库的锁,加解锁要在一个线程中。

三、资源限制

3.1 什么是资源限制?
资源限制是在进行并发编程时,程序的执行速度受限于计算机软件或硬件资源。

3.2 引发的问题?
因受限于资源,多线程执行并不会加快,反而增加了上下文切换和资源调度的时间。

3.3 如何解决?
硬件资源限制: 使用集群并行执行程序
软件资源限制: 使用资源池将资源复用

3.4 在资源限制下,如何进行并发编程?
根据不同的资源限制调整程序的并发度。

原文地址:https://www.cnblogs.com/chen-jia-cheng/p/14670876.html