445
1.画图说明线程的生命周期,以及各状态切换使用到的方法等
由于某个方法的调用导致状态的变化
https://blog.csdn.net/pange1991/article/details/53860651
2.同步代码共中涉及到同步监视器和共享数据,读谈你对同步监视器和共享数据的理解,以及注意点。
多个线程共同操作的数据称为共享数据。
注意点:
1)一个线程操作该数据时,其他线程不能进行操作,否则可能出现安全问题。应当使用同步代码。
2)同步监视器可以是任何一个类的对象
3)多个线程使用同步的话,得保证所用的同步监视器一样
同步代码块结构:
synchronized(/*同步监视器*/){
//书写操作共享数据的代码,保证执行时是单线程的
//不能多也不能少
}
同步方法中的同步监视器是谁?
是默认的,但我们要了解到底是谁。
(1)静态同步方法:是当前类本身(就是 类名.class) 加载时还没创建对象
(2)非静态方法:是this
3. sleep()和 wait()的区别
https://blog.csdn.net/qq_20009015/article/details/89980966
4.写一个线程安全的懒汉式
public class SingleTon{
private SingleTon(){}
private static SingleTon singleTon = null;
//当调用方法时,才创建单例对象
public static SingleTon getSingleTon(){
if(singleTon == null){//第一层检查,检查是否有引用对象,如果一个线程获取了实例,则不需要进入同步代码块中了
synchronized (SingleTon.class){//第一层锁,保证只有一个线程进入。同步代码块使用的锁是单例的字节码文件对象,且只能用这个锁
if(singleTon == null){ //第二层检查
singleTon = new SingleTon();
}
}
return singleTon;
}
}
5.创建多线程有几种方式
4种
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.线程池:响应速度提高了,提高了资源的重用率,便于管理
// 1. 创建线程池
// 创建时,通过配置线程池的参数,从而实现自己所需的线程池
Executor threadPool = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE,
KEEP_ALIVE,
TimeUnit.SECONDS,
sPoolWorkQueue,
sThreadFactory
);
// 注:在Java中,已内置4种常见线程池,下面会详细说明
// 2. 向线程池提交任务:execute()
// 说明:传入 Runnable对象
threadPool.execute(new Runnable() {
@Override
public void run() {
... // 线程执行任务
}
});
// 3. 关闭线程池shutdown()
threadPool.shutdown();
// 关闭线程的原理
// a. 遍历线程池中的所有工作线程
// b. 逐个调用线程的interrupt()中断线程(注:无法响应中断的任务可能永远无法终止)
// 也可调用shutdownNow()关闭线程:threadPool.shutdownNow()
// 二者区别:
// shutdown:设置 线程池的状态 为 SHUTDOWN,然后中断所有没有正在执行任务的线程
// shutdownNow:设置 线程池的状态 为 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表
// 使用建议:一般调用shutdown()关闭线程池;若任务不一定要执行完,则调用shutdownNow()
参考文章链接:
1.https://blog.csdn.net/u013541140/article/details/95225769
2.https://www.jianshu.com/p/0e4a5e70bf0e
标签:一考,SingleTon,同步,singleTon,445,调用,线程,监视器,硅谷 From: https://www.cnblogs.com/zWANG97/p/17169772.html