加入收藏 | 设为首页 | 会员中心 | 我要投稿 吉安站长网 (https://www.0796zz.com.cn/)- 科技、图像处理、媒体智能、办公协同、操作系统!
当前位置: 首页 > 站长资讯 > 评论 > 正文

我改变了对比特币的看法

发布时间:2021-01-30 19:09:42 所属栏目:评论 来源:互联网
导读:如何在两种存储引擎中进行选择? 是否有事务操作?有,InnoDB。 是否存储并发修改?有,InnoDB。 是否追求快速查询,且数据修改较少?是,MyISAM。 是否使用全文索引?如果不引用第三方框架,可以选择MyISAM,但是可以选用第三方框架和InnDB效率会更高。 系统文件

如何在两种存储引擎中进行选择?

  • 是否有事务操作?有,InnoDB。
  • 是否存储并发修改?有,InnoDB。
  • 是否追求快速查询,且数据修改较少?是,MyISAM。
  • 是否使用全文索引?如果不引用第三方框架,可以选择MyISAM,但是可以选用第三方框架和InnDB效率会更高。

系统文件存储层
 

到这里,我们应该明白,loadClass方法使用了模版方法模式,主线逻辑是双亲委派,但如何将class文件转化为Class对象的步骤,已经交由子类去实现。对模版方法模式不熟悉的同学,可以先参考我的另外一篇文章模版方法模式

其实源码中,已经有一个自定义类加载的样例代码,在注释中:
 

为什么要使用双亲委派机制,就使用当前的类加载器去加载不就行了吗?为啥搞得这么复杂呢?

假设现在并没有双亲委派机制,有这样的一个场景:

用户写了一个Student类,点击运行,此时编译完成后,虚拟机开始加载class,该class会由应用加载器进行加载,由于Object类是Student的父类,且双亲委派机制不存在的情况下,应用加载器就会自己尝试加载Object类,但是用户压根没定义Object,即应用加载器无法在加载范围搜寻到该类,所以此时Object类无法被加载,用户写的代码无法运行。

假设该用户自己定义了一个Object类,此时再次运行后,应用类加载器则会正常加载用户定义的Object与Student类。Student类中会调用System.out.print()输出Student对象,此时会由启动类加载器加载System类,在此之前同样也会加载Object类。

此时,方法区中有了两份Object的元数据,Object类被重复加载了!

倘若用户定义的Object类不安全,可能直接造成虚拟机崩溃或者引起重大安全问题。

如果现在使用双亲委派机制,用户虽然自己定义了Object类,可以通过编译,但是永远不会被记载进方法区。

双亲委派机制避免了重复加载,也保证了虚拟机的安全。

自定义类加载器

我们整理ClassLoader里面的流程

  1. loadclass:判断是否已加载,使用双亲委派模型,请求父加载器,父加载器反馈无法加载,因此使用findclass,让当前类加载器查找
  2. findclass:当前类加载器根据路径以及class文件名称加载字节码,从class文件中读取字节数组,然后使用defineClass
  3. defineclass:根据字节数组,返回Class对象

我们在ClassLoader里面找到findClass方法,发现该方法直接抛出异常,应该是留给子类实现的。

(编辑:吉安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读