1.线程的几种实现方式?怎么启动?怎么区分线程?
答:实现方式:(1)通过继承Thread类来实现线程
(2)通过实现Runnable接口实现线程
继承扩展性不强,因为java只支持单继承,如果一个类继承了Thread类就不能继承其他类。
启动方式:
Thread thread = new Thread(继承了Thread的对象/实现了Runnable对象);
Thread.start();
启动线程使用start方法,启动了以后执行的是run()方法。
在一个系统中很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?
只需要在创建线程后调用setName方法
Thread.setName(“设置一个线程名称”); 这是一种规范,在创建线程完成后,都需要设置名称。
2.什么是设计模式?常用的设计模式有哪些?
答:设计模式就是经过前人无数次实践总结出的,设计过程中可以反复使用的、可以解决特定问题的设计方法。
常用的设计模式:
单例模式:懒汉模式
饿汉模式:
- 构造方法私有化,除了自己类能创建外,其他地方不可以创建
- 在自己的类中创建一个单实例(饿汉模式是一出来就创建单实例,而了懒汉模式是需要的时候才创建)
- 提供一个方法获取该实例(创建时需要运行方法同步)
懒汉模式:
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全,如果你第一次接触单例模式,对线程安全不是很了解,可以先跳过下面这三小条,去看饿汉式单例,等看完后面再回头考虑线程安全的问题:
1、在getInstance方法上加同步
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
2、双重检查锁定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3、静态内部类
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
饿汉模式:
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
工厂模式:Spring的IOC,对象的创建交给一个工厂去创建
代理模式:Spring的AOP