单例模式的一些思考

具体实现单例模式的方法很多大神都有介绍,在这里分享一下自己在学习单例模式中的一些想法和思考

先写一个饿汉式
单例模式的一些思考
测试(第一次)
单例模式的一些思考

测试(第二次)
单例模式的一些思考
1.为什么同一次main方法中地址一样,而两次main方法中地址不一样?
单例不是应该不管如何执行,都应该是同一个地址值?
这里,我们可以理解一个main方法相当于一个容器,那么同一个main方法中的单例一定是同一个地址值.
但是如果再次执行main方法,相当于容器换了...在内存中,对之前的单例user又重新提供了一个地址值.,放入了新的容器.
所以就出现上面的现象.

2.那么同一个项目在服务器中启动后如何保证单例?不能每个人调用方法都重新提供地址值,那么就不是单例了...
其实,当一个项目放入服务器后启动,相当于你一直使用的是唯一的一个main方法.也就是一直是一个容器,只有当服务器停止后重新启动,才相当于重新执行了main方法,换了容器.也就是说,我们平时访问一个项目,该项目一直都在运行.所有人访问的都是同一个main方法,也就是同一个容器,那么单例也就实现了.
3.或者这样,当你执行main方法时,调用饿汉式.因为饿汉式是static修饰,在user类加载时,就产生了单例对象user.main方法执行完了.那么此时单例对象user就变成了垃圾.对吧.JVM垃圾回收机制会回收.那么下次再次调用main方法,如果上一个单例对象user还没被垃圾回收,就还用原来那个,所以地址值是同一个.否则,又会重新创建一个user单例对象.和之前的已经成为垃圾的单例对象user不是同一个,所以地址值也就不是同一个了. 所以在服务器中,要保证单例,首先写一个单例模式,然后是那个相当于main方法的程序一直不停止.也就不会被jvm垃圾回收机制当成垃圾回收,最终实现单例.
4.那么问题又来了?我们每一个用户访问一次我们的项目难道不是相当于调用一次main方法吗?那访问一次就调用一次main方法,单例不也没有用吗?
这里实际上,我们一个工程就相当于是一个main方法,放入服务器后启动就相当于执行了main方法,只要不关服务器,main方法就没有停止。每一个用户其实是一个线程,在内存中有各自的工作内存。创建的单例对象放在内存的公共访问区域,每一个工作内存都可以访问。在main方法中可以有多个线程,共用一个公共内存中的单例对象。当用户访问完工程,该线程就变成了垃圾,会被垃圾回收器处理,也就不会产生垃圾过多积攒在服务器中的问题。