一 基础概念
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 对象。类锁和对象锁之间也是互不干扰的。