几个常见小demo的考察
手写单例模式
- 为什么要有单例模式(实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象、缓存、系统全局配置对象等。这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源。)
- 实现单例模式的几个要点(首先要确保全局只有一个类的实例,所以要保证这一点,至少类的构造器要私有化;单例的类只能自己创建自己的实例,因为,构造器私有了,但是还要有一个实例,所以只能自己创建;单例类必须能够提供自己的唯一实例给其他类,所以要有一个公共的方法能返回该单例类的唯一实例)
- 实现方式(懒汉式,是最基本的实现方式,第一次调用才初始化,实现了懒加载的特性;饿汉式,类加载时就初始化实例,避免了多线程同步问题。)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
} 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
} 手写线程死锁
package com.wang;
import java.util.concurrent.TimeUnit;
class holdlock implements Runnable {
String lockA;
String lockB;
public holdlock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println("已经获得锁" + lockA + ",尝试获得锁" + lockB);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println("已经持有锁" + lockB + ",尝试获取锁" + lockA);
}
}
}
}
public class deadlockdemo {
public static void main(String[] args) {
String lockA = "locka";
String lockB = "lockb";
new Thread(new holdlock(lockA, lockB)).start();
new Thread(new holdlock(lockB, lockA)).start();
}
}
查看7道真题和解析
小天才公司福利 1322人发布
