Java进阶学习第十八节——线程的同步、生命周期

1. 课程介绍

  1. 线程同步(掌握)
  2. 线程等待与唤醒(目前了解)
  3. 线程的生命周期(了解)
  4. 定时器(掌握) 下来自己去看api文档,学会使用

2. 线程同步

2.1为什么需要线程同步

解决什么问题: 线程安全问题(例如1单例模式的懒汉模式;例如2多线程模拟多窗口售票-)

2.2 线程同步方式一:同步代码块
1、基本语法结构

synchronize(同步监听对象){
    需要被同步的代码(有线程安全问题的代码)
}
上面的结构相当于会把{}中的代码捆绑起来,看成是一个整体,一个线程执行完毕后其他的线程才能进来

2、语法特点:
① 同步监听对象理论上可以是任何的对象;
② 但是:必须保证多个线程访问到的是同一个同步监听对象;
③ 很多时候可以直接使用this,但是还必须参照②;
④ 另外一种常见的写法:使用类的字节码对象 例如String.class类的字节码对象:

Hello.java   源文件
Hello.class   字节码文件    存在于磁盘上的一个文件而已
字节码对象是指一个类在JVM中存在的一种状态(暂时了解)

特点: 一个类的字节码对象永远只有一份,不管通过何种方式加载的,相当于是单例的

3、示例演示:
演示示例①

在这里插入图片描述

在这里插入图片描述
结果: 一个窗口卖完了? 感觉不正常
原因:同步的是整个while,一旦有线程获得资源,就必须把同步里面的while循环完毕其它线程才进来
思考:我们真正需要同步的是什么? 我们需要同步的是销售一张票的流程代码

演示实例②:

在这里插入图片描述

结果: 出现了0 -1 ,感觉上面有判断,有同步
原因: 假设只有1张票
A线程判断while(1>0) … CPU切换
B线程判断while(1>0) …

问题的本质就是: 每销售一张票都应该判断是否有余票

正常的版本代码:

在这里插入图片描述

正常的版本代码2:

在这里插入图片描述

演示示例③ - 实现接口方式:

在这里插入图片描述

2.3 线程同步方式二:同步方法
1、使用到 synchronize 直接修饰一个方法就可以了;
2、位置,在方法的返回值类型前面;
3、同步方法不需要写同步监听对象,实例方法(非static修饰)默认同步监听对象是this;
4、同步方法不需要写同步监听对象,静态方法(有static修饰)默认同步监听对象是当前类所在的字节码对象 Xxx.class;

在这里插入图片描述

结果: 没有同步到
原因: 实例方法的默认同步监听对象是this,而上面创建了3个对象;
解决:
① 加一个static修饰这个方法; 但是不好
尝试使用实现的方法可能可以完成,如下的代码:

在这里插入图片描述

3. 线程的生命周期

1、简单来说就是从什么时候开始,到什么时候结束
2、线程的生命周期分几个阶段:
① 创建 ; 例如 Thread t = new Thread();
② 就绪 ; 调用了start方法 t.start() —> 告诉CPU我准备好了
③ 运行 ; 获得CPU的资源,开始执行线程体中的代码
④ 死亡 ; 有多种情况导致死亡,例如线程体执行完毕(自然老死);非自然死亡(异常没有处理好)
3、注意点:
① 休眠等操作可能导致正在运行的线程阻塞,阻塞完了(sleep完了)进入的是就绪状态
② 一个线程死了就死了,不能够死而复生

在这里插入图片描述

4. 定时器

4.1 应用场景
1、定时炸弹;
在这里插入图片描述

定时炸弹: 一个炸弹+定时器

2、闹钟
闹钟:定时功能+闹(播放音乐、震动)

3、智能家电(电饭煲。。。)
4、定时任务
5、。。。。

4.2 Java中是的实现方式 java.util.Timer
1、这个类就是一个定时器的类而已,
2、就想做一个定时炸弹,怎么下手呢?预估Timer中会有些什么功能?
① 设置时间(定时);
② 时间到了后需要去执行一个定时的任务

3、定时炸弹的代码流程:
① 创建一个Timer对象;
② 调用里面的设置时间和任务的方法:
void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务
③ 自定义一个类 extends TimerTask ;
④ 覆写TimerTask 中的run方法
⑤ 运行程序

补充

线程优先级

在这里插入图片描述

线程锁机制:

使用锁机制  (与同步相似)   首先要有一个锁,并且是final修饰
			lock.lock();上锁
 		try{
				需要锁住的代码	
			}finally{
				最终执行的代码,注意解锁	
			}

在这里插入图片描述

线程通信:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38846837/article/details/84960131
今日推荐