并发编程的优缺点

总结

1.并发优缺点:
优点:
图像处理,遍历耗时,充分利用多核CPU资源,提高效率;复杂业务分块,更适合复杂业务。
缺点:
a.上下文切换,要存储当前状态,加载状态,耗时。
尽量不使用锁,导致竞争锁的上下文切换(CAS);
最少使用线程,避免线程浪费等待。

b.死锁,锁没法释放,导致阻塞的线程一直阻塞。
避免一个线程获得多个锁。
线程间加锁顺序尽量一致。
使用定时锁

2.同步异步
指调用方法,调动同步,必须阻塞等待其执行结束,才能接着往后执行
调用异步,不必等待调用方法返回结果,继续往后执行代码

3.并行并发
并发:一个CPU,同一时刻,只有一个线程同时运行。
并行:多个CPU,同一时刻,多个线程同时运行。

4.阻塞和非阻塞
只线程间的相互影响,某个线程获得了临界区资源,其他相乘想要获取,就必须等待阻塞其释放才行。
非阻塞:没有线程能阻塞其他线程,所有线程尝试向后执行。

5.临界区
表示一种公共资源。可以被多个线程获取,一旦资源被某个线程占有,其他线程必须等待。


1.为什么要用到并发?并发优点?并发场景?

充分利用多核CPU的计算能力。
图像处理:天然适合并发编程,图片包含大量像素,即使遍历一遍像素都需要很长时间。充分利用多核CPU的计算能力。

方便业务拆分
网上购物业务复杂,拆分:减库存,生成订单,提高响应速度。并行程序比串行程序更适合这种业务需求。

2.并发编程有哪些缺点

2.1 频繁上下文切换
尽量不使用锁,减少锁竞争带来的上下文切换。(分段锁,CAS算法)
最少使用线程原则,避免线程浪费等待。

CPU分配给线程的执行时间片一般为几十毫秒。每次切换线程需要保存当前状态,损耗性能。过于频繁的切换反而无法发挥出多线程的优势。

办法:为减少上下文切换,采用无锁并发编程;CAS算法;使用最少的线程;使用协程。

无锁并发编程:concurrentHashMap锁分段思想,不同线程处理不同段的数据,多线程竞争减少上下文切换。

CAS算法:利用Atomic下使用的CAS算法,使用乐观锁,减少一部分不必要的锁竞争带来的上下文切换。

使用最少线程:避免创建不需要的线程,如任务少但创建很多线程造成大量线程等待

2.2 线程安全
死锁
避免死锁的方法:
1.避免一个线程同时获得多个锁。
2.线程间加锁的顺序尽量一致。
3.尝试使用定时锁lock.tryLock(timeOut),超过时间,线程不会阻塞。

public class DeadLockDemo {

    private static String resource_a = "A";
    private static String resource_b = "B";

    public static void main(String[] args) {
        deadLock();
    }

    public static void deadLock() {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resource_a) {
                    System.out.println("get resource a");
                    try {
                        Thread.sleep(3000);
                        synchronized (resource_b) {
                            System.out.println("get resorce b");
                        }
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resource_b) {
                    System.out.println("get resource b");
                    synchronized (resource_a) {
                        System.out.println("get resource a");
                    }
                }
            }
        });

        threadA.start();
        threadB.start();
    }
}

3.应该了解的概念

3.1 同步异步
同步异步通常用来形容一次方法的调用。
调用同步方法,调用者必须等待调用方法结束后,才能执行后面的代码。
调用异步方法,调用者不管调用方法有没有执行完,都会执行后面的代码。

3.2 并行与并发
并发:一个时刻,只能有一个线程执行,一个CPU,多线程获得CPU的时间分片。
并行:一个时刻,可以有多个线程同时运行,多个CPU。

3.3 阻塞和非阻塞
通常用来形容多线程间的相互影响。比如一个线程占有了临界区的资源,其他线程想要获得这个资源,就必须等待该资源的释放,会等待,即阻塞。
非阻塞:强调没有一个线程可以阻塞其他线程,所有线程都会尝试地往前执行。

3.4临界区
表示一种公共资源。可以被多个线程获取,一旦资源被某个线程占有,其他线程必须等待。


转载https://juejin.im/post/5ae6c3ef6fb9a07ab508ac85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值