知识点:
进程与线程
volatile关键字:在我们的多线程开发中,我们用Volatile关键字来限定某个变量或者属性时,线程在每次使用变量的时候,都会读取变量修改后的最新的值,即Volatile关键字保证了变量的可见性;https://blog.csdn.net/kris1025/article/details/80008885
java语法中有一个函数能够确保只调用一次,静态构造函数
synchronized(XXX.class)会阻塞后面返回相同class的synchronized(XXX.class)代码
静态字段通过类来访问,最好不要通过实例
内部类就相当于一个外部类的成员变量,所以可以直接访问外部变量,外部类不能直接访问内部类变量,必须通过创建内部类实例的方法访问
代码实现:
同步锁+两次判断:可以解决多线程问题,缺点是代码较复杂
class A {
//定义静态变量,用于存储唯一的对象
private static volatile A instance = null;
//定义静态构造方法
private A() {
}
//定义一个public方法,让其调用静态构造方法产生对象
public static A getInstance() {
if (instance == null) {
//加锁,一个一个执行
synchronized (A.class) {
if (instance == null)
instance = new A();
}
}
return instance;
}
}
初始化实例对象,可以解决多线程问题,代码简洁,缺点是调用B类,就会创建对象,内存使用率不高
class B{
//初始化对象
private static B uniqueinstance = new B();
//定义静态构造方法
private B() {
}
//定义一个public方法,让其调用静态构造方法产生对象
public static B getInstance() {
return uniqueinstance;
}
}
静态内部类,在上个方法的基础上解决了内存使用率使用不高的缺点
class D {
private D(){
}
//定义一个公共方法,通过调用内部类来访问属性
public static D getInstance() {
return DInner.uniqueinstance;
}
//定义一个静态内部类,类中将对象存为属性
private static class DInner{
private static final D uniqueinstance = new D();
}
}