多线程(同步代码块,同步方法,Lock锁,线程的状态,等待唤醒机制)
同步代码块:
作用:
把操作共享数据的代码锁起来;
格式:
synchronized(锁对象){
操作共享数据的代码
}
锁对象一定是唯一的;
特点:
- 锁默认打开,有一个线程进去了,锁自动关闭;
- 里面的代码全部执行完毕,线程出来,锁自动打开;
同步方法:
概述:
把操作共享数据的代码锁起来;
把synchronized关键字加到方法上
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){...}
特点:
- 同步方法是锁住方法里面所有的代码;
- 锁对象不能自己指定;
- 非静态: this;
- 静态: 当前类的字节码文件对象;
Lock锁:
作用:
可以手动的把操作共享数据的代码锁起来或者释放;
实现:
Lock是接口不能直接实例化,这里是采用它的实现类ReentrantLock来实例化的;
void lock(): 获得锁
void unlock(): 释放锁
线程的状态:
新建状态(NEW) -> 创建线程对象
就绪状态(RUNNABLE) -> start方法
阻塞状态(BLOCKED) -> 无法获得锁对象
等待状态(WAITING) -> wait方法
计时等待(TIME_WAITING) -> sleep方法
结束状态(TERMINATED) -> 全部代码运行完毕
等待唤醒机制: