1. java基础
1.1 j ava8 新特性
1.1.1 Lamda表达式
函数式接口:有且仅有一个抽象方法的接口
1.2 java容器
2.java jvm
1 java运行时内存:
a)线程公用内存:方法区(no-heap)、堆(heap)
b)线程私有内存:虚拟机栈、本地方法栈、程序计数器
内存区的异常:stack over flow \ out of memory
2.对象头:1.mark(GC、class pointer、age、lock )
对象体:
对齐占位
3.java多线程
3.1 线程和进程
3.1.1线程的创建
线程:CPU调度的最小单位。 进程:一个进程至少含有一个线程。
线程的状态:START RUNABLE(ready&&running)WAIT(&&) BLOCKING teminal
create a Thread in java : 1.Thread.
2.Runable.
3.Callable.
4.ThreadPool.
Runable 拓展性更强、数据跟操作分离。
Callable 有返回值
ThreadPool 线程池,不需要反复创建和销毁。
3.1.2线程的生命周期
线程生命周期
- START
- RUNABLE(Ready&&Running)
- WAIT
- BLOCKING
- TEMINAL
线程方法
-
thread.start();
-
启动线程,线程进入ready状态,获取CPU时间片后进入Running状态
-
thread.sleep();
-
thread.yield();
- 当前线程让出CPU时间片,进入ready状态。
-
thread.interupted();
- 当前线程并不会中断,如果被 interupted属性赋值为true;
-
thread.stop(); -
不建议使用,属于不安全方法。可以理解为拔掉一台正在执行作业的计算机的电源。
wait && sleep:都会让线程处于watting状态
| wait | sleep | |
|---|---|---|
| 对象 | Object | Thread |
| 通讯 | 线程间通讯 | 线程独有 |
| 结束方式 | 其他线程唤醒,或限时等待结束 | 等待睡眠时间结束 |
| 持有锁 | 释放锁 | 持有锁(可能造成死锁) |
| 异常 | 不需要捕获异常 | 需要捕获异常 |
| 调用位置 | thead方法体中 | 任意位置 |
3.2 内置锁(外置锁)
3.2.1 synconized
synconized代码块 。
类锁:作用于static 方法。只有一份。
3.2.2 锁粒度
- 无锁
- 当没有线程进去边界代码区域时,对象处于无锁状态。
- 偏向锁
- 当有一个线程进去时,锁升级为偏向锁,当有第二个线程加入,出现竞态时,锁会偏向之前持有过锁的线程。
- (可以理解为:做生意的人更愿意和熟人合作,因为你已经有过成功案例,相信这次给到也有能力完成)
- 轻量锁(CAS)
- 对象处于偏向锁状态时,有更多的线程的线程加入时,锁升级为轻量锁。大家共同竞争,锁不在偏向于谁。
- 适应性自旋:线程不会无限制的自旋等待,而是根据线程上次的成功的时间等待。
- 重量锁(独占锁)。
- 线程不在自旋等待,而是一次只有一个线程访问。monitor
锁升级是不可逆的。
解锁方式:边界区代码执行完毕、或者代码内发生异常会释放。自动解锁。
3.3 外置锁
乐观锁&&悲观锁
乐观锁:乐观的认为每次修改边界区的时候
乐观锁本质上不是锁,是利用CAS原语的原子性和volite的可见性,在多线程在操作同一个变量时,只有一个线程能够修改成功。
缺点:当线程过多时候,大量线程做自旋等待,消耗CPU性能。
ABA问题:本质是线程不可见,线程操作的都是变量的副本
独占锁&&非独占锁
可重入锁&&不可重入锁
公平锁&&非公平锁
读锁&写锁&读写锁
死锁&&死锁解决及避免