使用枚举实现单例的好处
- 代码简洁易于阅读
- 能有效防止序列化或者反射攻击
1.创建一个连接池类(例如数据库连接池),这种功能的类,我们一般都希望它是一个单例的类
public class ConnectionPool {
public void getConnection(){
System.out.println(this.hashCode() + ": get a connection");
}
}
2.新建一个枚举类,用来管理连接池类
public enum PoolManager {
INSTANCE;
private ConnectionPool connectionPool = new ConnectionPool();
public ConnectionPool getConnectionPool(){
return this.connectionPool;
}
}
3.测试单线程
public class App {
public static void main(String[] args) {
PoolManager.INSTANCE.getConnectionPool().getConnection();
PoolManager.INSTANCE.getConnectionPool().getConnection();
PoolManager.INSTANCE.getConnectionPool().getConnection();
new ConnectionPool().getConnection();
new ConnectionPool().getConnection();
new ConnectionPool().getConnection();
}
}
result :
2061475679: get a connection
2061475679: get a connection
2061475679: get a connection
140435067: get a connection
1450495309: get a connection
1670782018: get a connection
- PoolManager管理的ConnectionPool的hashcode是一致的
- new 出来的ConnectionPool hashcode不一致,并不是同一个对象
4.测试多线程环境
public static void main(String[] args) {
for (int i = 0; i < 10000; i++){
new Thread(new Runnable() {
@Override
public void run() {
PoolManager.INSTANCE.getConnectionPool().getConnection();
}
}).start();
}
}
resut :
1184554318: get a connection
1184554318: get a connection
1184554318: get a connection
1184554318: get a connection
1184554318: get a connection
....
....
- 多线程环境下ConnectionPool hashcode也是一致的
网友评论