面试直击之JavaSE复习day3

  • 关于多线程

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实现禁止指令重排优化,从而避免在多线程环境下出现乱序执行的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值