总结:
单例模式必然会被多个线程访问。多线程访问一定要注意锁的问题。参考博主之前分享的转载文章《java中的锁》,有几种方式如下: 自旋锁类锁和对象锁共享锁和排它锁偏向锁互斥锁闭锁活锁分段锁无锁 无状态编程线程本地存储volatileCAS协程不使用synchronized和lock这两种工具,但仍可以参考其他方案: 无状态编程:不适用线程本地存储:例如lock加速性能用。不适用volatile:必须使用,构造wallCAS:可以使用,代替lock或者synchronized协程:不适用考虑使用volatile+CAS,例如volatile+atomicboolean具体来说,需要实现类似synchronized和lock的关键区域的入口和出口的功能,入口通过BtomicBoolean shouldEnter.compareAndSet(false,true)实现,并在其中new实例,然后标记可以进入出口了即AtomicBoolean shouldLeave.set()。随后,在外层用shouldLeave.isset()判定。注意,由于有入口出口以及new对象,同样有new时创建了实例退出关键区域但还没有来得及初始化的问题,volatile可以解决。关键代码如下: private static AtomicBoolean shouldEnter = new AtomicBoolean( false); private static AtomicBoolean shouldLeave = new AtomicBoolean( false); private static volatile ThreadSafeSingleton instance; private ThreadSafeSingleton() { } public static ThreadSafeSingleton getInstance() { if (instance == null) { if (shouldEnter.compareAndSet( false, true)) { instance = new ThreadSafeSingleton(); shouldLeave.set( true); } while (!shouldLeave.get()) { } } return instance; }