多线程

Posted laurarararararara

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

多线程

课程内容

  1. 并发和并行
  2. 线程和进程  概念,区别
  3. 线程状态  Thread类
  4. 线程常用的方法及线程调度    sleep、yield、join、interrupet...
  5. 线程状态转化
  6. 关键字 volatile: 特征:可见性、禁止指令重排序  底层实现机制
  7. 线程同步:Synchronized  使用场景、字节码的语义、底层实现(原子性、可见性、有序性)
  8. 线程间通信 wait、notify、notifyAll
  9. 线程间通信的经典使用:生产者、消费者模型
  10. 锁:乐观锁、悲观锁、重量级锁、偏向锁、自旋锁、重入锁、读写锁
  11. CAS   原理,ABA问题及解决
  12. 锁的优化
  13. 死锁
  14. JUC:(Java.util.Concurrent) ConcurrentHashMap
  15. Atom:AtomInteger...
  16. BlockingQueue(同步阻塞队列):ArrayBlockingQueue...
  17. 线程池、特殊线程池类

参考书籍

《深入理解Java虚拟机》 第12、13章

《Java 核心技术卷1》 第14章

《java 并发编程艺术》 通读

并发和并行

最大化来提高计算机的使用率

并发和并行的区别

并发是指多个线程操作同一个资源,不是同时执行,而是交替执行,单核CPU,只不过因为CPU的时间片很短,速度太快,看起来是同时执行(张三、李四厨师,共用一口锅炒菜,交替执行)

并行才是真正的同时执行,多核CPU。每个线程使用一个单独的CPU的资源来运行(张三、李四厨师、一人一口锅,一起炒菜)

 

并发编程:是指允许多个任务在一个时间端内重复的执行的设计结构

 

技术图片

并发示意图

技术图片

并行示意图

 

高并发:我们设计的程序,可以执行海量的任务同时执行

  • QPS:每秒能够响应的请求数,QPS并不是并发数
  • 吞吐量:单位时间内处理的请求数,QPS和并发数决定的
  • 平均响应时间:系统对一个请求作出响应的平均响应时间 QPS=并发数/平均响应时间
  • 并发用户数:系统可以承载的最大用户量

 

互联网系统的架构中们如何提高系统的并发能力?

  • 垂直扩展
  • 水平扩展

垂直扩展

提升单机的处理能力

1、增强单机的硬件性能:增加CPU的核数、内存升级、磁盘扩容

2、提升系统的架构能力:使用Cache来提高效率

水平扩展

集群、分布式都是水平的扩展方案

集群:多个人做同一事(同时多顾几个厨师同时炒菜)

分布式:一个复杂的事情,拆分成几个简单的步骤,分别找不同的人去完成(1、洗菜 2、切菜 3、炒菜)

1、站点层扩容:通过nginx反向代理,实现高并发的系统,将服务部署在多个服务器上

2、服务层扩容:通过RPC框架实现远程调用:Dubbo,Spring Clodud,将业务逻辑分拆成不同的RPC Client,

Clident完成各自的不同的业务,如果并发量比较大,新增加RPC Client

3:数据层扩容:一台数据库拆分成多态,分库分表,主从复制,读写分离

  技术图片

进程和线程

进程和线程的概念

进程是计算机上正在执行的一个独立的应用程序,进程是一个动态概念,必须是进行状态。如果一个应用程序没有启动,那就不是进程:进程是资源的分配的基本单位(内存、进程ID(PID))

线程是组成进程的基本单位,可以完成特定的功能,一个进程是有一个后者多个线程组成的:线程是资源调度的单位

 

进程和线程的区别:

1、内存空间的区别:

 进程是有独立的内存空间,每个进程之间是相互独立的,互不干扰,

   线程有共享的内存空间(也有私有的)

2、安全性:进程是相互独立的,一个进程的奔溃不会影响到其他的进程,进程是安全的,

线程存在内存空间的共享,一个线程的奔溃可能会影响到其他的线程的执行。,线程的安全性不如进程

 

关系:进程是相互独立的,一个进程下可以有一个或者多个线程

 

Java中很少使用进程的概念,但也可以使用:

技术图片

 

Java默认有几个线程呢?

(Main方法启动会对应启动一个JVM实例,Main也是Java的一个进程,也叫做主线程)

Java默认是有两个线程:主线程和垃圾回收的线程(Main和GC)

 

Java本身能否启动线程?

start方法来启动并创建出新线程:底层调用native的start0方法

技术图片

Java本身是没办法启动线程的,线启动时需要底层操作系统支持的,Java通过调用本地方法,C++编写的动态函数库,由C++去操作底层启动线程,Java是通过间接的调用来启动线程

 

 
 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)