几个常见小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(); } }