楼上顶一个,楼主,假设现在有三个线程 我们来看怎样获取 Single 它的实例 。
那么 线程1 进入 进入获取实例方法 进了synchronized (Single.class)同步方法后获取实例 出了同步方法,
线程2 继续进了同步方法发现实例不为空 出了同步方法,
线程3 继续进了同步方法发现实例不为空 出了同步方法。
按楼上的进行走一遍,
线程1 进入获取实例方法 首先判断是否有 Single 它的实例。如果没有 进入synchronized (Single.class)同步方法 , 同样再一次进入判断 没有 就获取 Single 它的实例。
线程2 首先会判断是否有实例,如果有就不进synchronized (Single.class)同步方法 。
线程3 同上。
经过上边的分析,也就是说用楼上的方法,效率会高一些,那么会高在哪里? 我们首先来看 同步的机制,
当一个线程进了同步的方法时,另一个线程只有等到 进入同步的线程走完了后才能 进去,大大影响了效率。
ps. 真正运行的时候 不一定是按我所分析的线程1、线程2、线程3这个顺序来的,取决于电脑的cpu,但是流程基本差不多, 还有一点 , 就是 static 有这个修饰符说明在jvm加载 class是的时候就给他一份空间,不在堆区和栈区。同时也方便更好的调用,final ,就不用说了吧! |