- 关于多线程
1.线程的几种创建方式
①继承Thread类
②试过实现Runnable接口
继承方式扩展性不强,因为Java只支持单继承,如果一个类继承了Thread就不能继承其他的类了
2.启动的方式
Thread t=new Thread(继承了Thread的对象/实现了Runnable的对象);
t.start();
启动线程用start()方法,启动之后执行的是run方法
3.怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我们想区分是哪个线程打印的怎么办?
可以使用thread.setName("设置的线程的名字"),只是一种规范,在创建线程完成后,都需要设置名称。
4.线程并发库
java.util.current包中提供了对线程优化,管理的各项操作,使得线程的使用变得更得心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制。
1)线程池:
java通过Excutors提供了四个静态方法创建四种线程池,分别为:
①newCachedThreadPool——:创建一个可缓存线程池,如果线程池长度超过处理需要,可邻国的回收空闲线程,若五可回收,则新建线程。
②newFixedThreadPool——固定大小连接池:创建一个固定大小的线程池,可控制最大并发数,超出的线程会在队列中等待。
③newScheduledTheadPool:创建一个定长线程池,支持定时及周期性任务执行。
④newSingleThreadExecutor——单任务线程池:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有的任务按照指定顺序(FIFO,LIFO,优先级)执行。
5.线程池的作用
①限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃。
②线程池不需要每次都去创建或销毁,节约了资源
③线程池不需要每次都去创建,响应时间更快。
- 什么是设计模式?常见的设计模式有哪些?
1. 设计模式就是经过无数开发人员的无数次的实践总结出的,实际过程中可以反复使用的,可以解决特定问题的设计方法。
2.常见的设计模式有:
1)单例模式:最常见的设计模式
①懒汉式:需要的时候才创建对象
②饿汉式:一开始就把单实例对象创建好
共同特点:a:构造方法私有化,让除了自己类可以创建对象外其他地地方都不能创建
b: 在自己类中,创建一个单实例
c: 提供一个方法获取该实例对象,创建时需要进行方法同步
2)工厂模式:Spring IOC就是使用了工厂模式,即对象的创建交给一个工厂去创建
3)代理模式:Spring AOP就是使用的动态代理
4)包装模式:知道即可,不需要深入。
- JMM三大特性
1)可见性:即某个线程对主内存的变量进行修改,修改完成后写回主内存,其他线程可以立即收到消息,并且更新自己工作空间中变量的值,这就是可见性。即可见性就是一种及时通知机制。
2)原子性:完整性,即不可分割。某个线程正在做某个具体业务时,中间不可以被加塞或者分割,需要整体完整,要么同时成功,要么同时失败。
3)指令重排(有序性):计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为三种:
①单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致
②处理器再进行重排序时,必须要考虑指令之间的数据依赖性
③多线程在环境中线程交替执行,由于编译器优化中排序的存在,两个线程中使用的变量能否保持一致是无法确定的,结果而无法预测。
- volatile
volatile是Java虚拟机提供的一种轻量级的同步机制(可以理解为低配版的sychronized),它可以
①保证可见性
②不保证原子性
③禁止指令重排(保证有序)
volatile只保证JMM三大特性中的两个,可见性和有序性。
验证volatile的可见性:假如int number=0;number变量之前没有添加volatile关键字修饰,没有可见行。添加了volatile后可以解决可见性问题。
volatile实现禁止指令重排优化,从而避免在多线程环境下出现乱序执行的现象。