1.线程与进程
2.线程创建和启动
注意:与直接调用run方法的区别(与普通调用没有区别,线程并没有启动)
3个线程的栈内存分布
执行路径(线程之间)互不影响
4.线程状态
5.买票例子
安全问题分析
6.synchronized同步代码块(同步锁)
使用注意:哪些代码需要同步,哪些不需要
其实所传的对象就是锁。
0走后,obj被归还(置1)
7.同步函数
8.同步函数与同步代码块的锁
注意同步静态函数的锁:getClass();获取 或者 类名.class
9.多线程—单例模式
10.死锁演示
死锁常见情景之一:同步嵌套
public class DeadLock {
private static Object lockA = new Object();
private static Object lockB = new Object();
public static void main(String[] args) {
//创建两个线程
new Thread(() -> {
synchronized (lockA) {
try {
Thread.currentThread().sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println("我先拿到了lockA,又拿到了lockB,你敢信?");
}
}
}).start();
new Thread(() -> {
synchronized (lockB) {
try {
Thread.currentThread().sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lockA) {
System.out.println("我先拿到了lockB,又拿到了lockA,你敢信?");
}
}
}).start();
}
}
11.多线程通信—等待唤醒机制
12.等待唤醒机制—多生产者消费者问题
13.JDK 5.0后Lock代替synchronized
注意:无论如何,都要释放锁
14.一个锁两个监视器(condition)解决多生产者消费者问题
15.解惑
16.线程结束
1.stop
2.run方法结束
2.1.设置标志
2.2.interrupt()方法
16.线程类的其他方法
1.守护线程
2.join方法
17.面试题
(run没有覆盖)
运行结果:subThread run