第一节:多线程基础知识

一 基础概念

  1. 什么是进程: 进程是操作系统分配资源的最小单位,是cpu调度的最小单位

  2. 什么是线程: 任何一个进程里都有至少一个线程

  3. cpu核心数和线程数的关系: 

    1) 多核心是单芯片上多处理器,依靠多个处理器同时并行运行程序实现并行处理

    2) 一个处理器上多个程序同步执行共享处理器的资源

    3) 一般来说一个处理器对应一个线程数,但inter引进超核技术是一个处理器可以处理俩个线程数

  4. cpu时间片轮转:以单核cpu为例子,每个程序在cpu上都是一个运行一个时间片的时间,在时间片时间内运行完或者时间片时间耗尽都会进行时间片轮转,给下一个程序使用cpu;cpu时间片之间切换非常耗时,比如保存和装入寄存器值及内存映像,更新各种表格和队列等,如果一个时间片是20ms,那么切换的准备就需要5ms,需要百分之二十的时间做上下文切换,所以多线程频繁上下文切换很耗时就是这个原因。

  5. 并发与并行: 并发是利用在单个cpu上时间片轮转机制进行多任务切换实现并发,并行是多个cpu各自执行对应或者二倍cpu数目工作

  6. 高并发的好处,意义和注意事项:充分利用cpu资源,比如你的机器是双核,那么单线程跑只能利用四分之一资源;还可以加快用户响应时间,比如迅雷下载,多线程下载和多线程下载谁快显而易见;可以使代码结构化,简单化,异步化,比如下订单发邮件可以独立成俩个模块,有其他程序调度;

  7. 多线程需要注意的事项:线程之间的安全,比如全局变量的修改;线程之间的死锁,资源的抢夺;

  8. Java里的线程:Java是天生的多线程,一个main程序就要如下线程;并且java中对操作系统级别线程的抽象是Thread

[6] Monitor Ctrl-Break //监控 Ctrl-Break 中断信号的
[5] Attach Listener //内存 dump,线程 dump,类信息统计,获取系统属性等
[4] Signal Dispatcher // 分发处理发送给 JVM 信号的线程
[3] Finalizer // 调用对象 finalize 方法的线程
[2] Reference Handler//清除 Reference 的线程
[1] main //main 线程,用户程序入口

  9. 线程的启动与终止:可以通过thread ,start();runnable .run()进行启动;至于终止,要么程序自然执行完,要么抛出异常提前结束,要么interrupt手动结束;

二 深入理解多线程

  1. run() :得到cpu执行方法,一般业务代码写在这里,可以多次执行

  2. start() :让线程进行就绪状态等待分配cpu ,只可以执行一次

  3. 守护线程:deamon,只能伴随其他线程一起存在,并且伴随的线程一旦死亡也就随之结束,一半做支持性工作,比如 gc

三 线程间的共享协作

  1. sychronized锁:可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量

访问的可见性和排他性,又称为内置锁机制。注意,锁的是不变的对象

  2. 对象锁和类锁:对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的 class 对象上的。我们知道,类的对象实例可以有很多个,但

是每个类只有一个 class 对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存
在的,类锁其实锁的是每个类的对应的 class 对象。类锁和对象锁之间也是互不干扰的。
原文地址:https://www.cnblogs.com/xiaoshahai/p/13861586.html