多线程
Posted laurarararararara
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。
多线程
课程内容
- 并发和并行
- 线程和进程 概念,区别
- 线程状态 Thread类
- 线程常用的方法及线程调度 sleep、yield、join、interrupet...
- 线程状态转化
- 关键字 volatile: 特征:可见性、禁止指令重排序 底层实现机制
- 线程同步:Synchronized 使用场景、字节码的语义、底层实现(原子性、可见性、有序性)
- 线程间通信 wait、notify、notifyAll
- 线程间通信的经典使用:生产者、消费者模型
- 锁:乐观锁、悲观锁、重量级锁、偏向锁、自旋锁、重入锁、读写锁
- CAS 原理,ABA问题及解决
- 锁的优化
- 死锁
- JUC:(Java.util.Concurrent) ConcurrentHashMap
- Atom:AtomInteger...
- BlockingQueue(同步阻塞队列):ArrayBlockingQueue...
- 线程池、特殊线程池类
参考书籍
《深入理解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是通过间接的调用来启动线程
以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章