总结
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临界区
表示一种公共资源。可以被多个线程获取,一旦资源被某个线程占有,其他线程必须等待。