day17每日一考
题目
1.画图说明线程的生命周期,以及各状态切换使用到的方法等
2.同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点。
3.sleep()和wait()的区别
4.写一个线程安全的濑汉式
5.创建多线程有哪几种方式
答案
第一题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYaUwIbW-1658650981585)(https://cdn.jsdelivr.net/gh/gaoyoudao/Picture/img/image-20220724152227550.png)]
第二题
同步监视器只能为单一对象,使用同一个同步监视器
同步监视器可以为任意类,俗称锁
在实现方法中可以直接使用this来充当同步监视器
在继承类中则需要类名.class来充当同步监视器
同步监视器不可以包含过多或过少
共享数据代码用synchronized()方法包含。
共享数据在实现方法中可以直接使用非静态属性来充当同步监视器
共享数据在继承类中可以必须使用静态属性来充当同步监视器
第三题
在执行wait方法的时候会释放同步锁,sleep不会
wait方法可以手动方法释放,sleep不会
sleep可以放在代码任何需要休眠的地方,wait只可以放在同步代码块或同步方法的方法体中
sleep是Thread的静态方法,wait是java.lang.Object类的非静态方法
第四题
public class Bank {
private Bank() {
}
private static Bank bank=null;
public static Bank getInstance(){
if (bank!=null) {
synchronized (Bank.class) {
if(bank!=null){
bank=new Bank();
return bank;
}
return bank;
}
}
return bank;
}
}
第五题
创建多线程有四种方式
- 继承Thread类
- 实现Runnable接口
- 线程池
- 实现Callable接口