JUC(13)

48 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

以上实现没有考虑:

  • 连接的动态增长与收缩
  • 连接保活(可用性检测)
  • 等待超时处理
  • 分布式 hash

对于关系型数据库,有比较成熟的连接池实现,例如c3p0, druid等 对于更通用的对象池,可以考虑使用apache commons pool,例如redis连接池可以参考jedis中关于连接池的实现

7.4 final的原理

设置final变量的原理

final int a = 20;

对于多线程来说,如果不加final,可能会读到还没有初始化的a也就是读到的a为0不为20

获取final变量的原理

final变量中的小值存放在栈内存中,把超过了最大值的放在常量池中,不用final修饰的话都是放在堆中,效率都要低于栈和常量池

final会把小值复制到栈中,超过了最大值的复制到常量池中,不加final相当于在堆中,访问速度会很慢

7.5无状态

在 web 阶段学习时,设计 Servlet 时为了保证其线程安全,都会有这样的建议,不要为 Servlet 设置成员变量,这 种没有任何成员变量的类是线程安全的

因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称之为【无状态】

7.6 本章小结

  • 不可变类使用
  • 不可变类设计
  • 原理方面

    • final
  • 模式方面

    • 享元

这里插播一个Netty的具体体现 0. 每个小朋友配一个老师。每个老师隔段时间询问小朋友是否要上厕所,如果要上,就领他去厕所,100 个小朋友就需要 100 个老师来询问,并且每个小朋友上厕所的时候都需要一个老师领着他去上,这就是IO模型,一个连接对应一个线程。 0. 所有的小朋友都配同一个老师。这个老师隔段时间询问所有的小朋友是否有人要上厕所,然后每一时刻把所有要上厕所的小朋友批量领到厕所,这就是 NIO 模型,所有小朋友都注册到同一个老师,对应的就是所有的连接都注册到一个线程,然后批量轮询。