多线程与高并发——基本概念

多线程与高并发——基本概念

1. 何为进程?何为线程?

  • 进程是程序的一次执行过程,是系统运行程序的基本单位,是动态的。

  • 线程是一个比进程更小的执行单位(也叫轻量级进程)。一个进程在其执行的过程中可以产生多个线程。 之后可以扯JVM相关的内容,例如多个线程共享进程的方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈

2. 并发与并行的概念

  • 并发: 同一时间段,多个任务都在执行 (单位时间内不一定同时执行,即交替执行);

  • 并行: 单位时间内,多个任务同时执行。

3. 创建线程的方式(Java)

  • 继承Thread类
  • 实现Runnable接口
  • Callable和Future创建线程
  • 线程池

4. 上下文切换

问多线程不一定很快的原因,可以回答这一点

如何减少上下文切换:1. 无锁并发编程 2. CAS算法 3. 使用最少线程 4. 协程

5.sleep(),join(),yield()

  • sleep():即将当前线程休眠一段时间,并不会释放锁,但是会释放CPU资源(这是与wait的区别,sleep不会释放锁,当睡眠的时间到了之后,线程会自动进入可执行状态,等待cpu执行。而wait会释放锁,而且此时必须有另外线程执行notify或者notifyAll,才会唤醒执行了wait方法的线程,该线程才能等待cpu执行)

注意,sleep(),yield(),都是Thread的静态方法,用一个线程的实例去调用是没有意义的,因为这样是让执行该方法的线程进行睡眠或礼让。(join使用final修饰的)

  • yield():让出CPU资源,重新进行调度,之后还是执行yield()的线程也是有可能的,因为这是由CPU进行调度的,即我礼让一下,然后大家(包括我)再一起抢

  • join():意思就是在自己当前线程加入你调用Join的线程(),本线程等待。等调用的线程运行

    完了,自己再去执行。t1和t2两个线程,在t1的某个点上调用了t2.join,它会跑到t2去运行,t1等待t2运

    行完毕继续t1运行(自己join自己没有意义)

6. 线程的六种状态以及转化

多线程与高并发——基本概念_第1张图片

——————————————————————————————————————————————————————

后面的不用掌握,瞄一眼有个印象即可

7. 避免死锁的几个常见方法

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
  • 尝试使用定时锁,使用lock.tryLock(timeout) 来替代使用内部锁机制
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里面,否则会出现解锁失败的情况

8. 如何解决资源限制的问题

  • 对于硬件资源限制,使用集群并发执行程序
  • 对于软件资源限制,使用资源池将资源复用

你可能感兴趣的:(多线程与高并发,多线程)