java吧 关注:1,234,285贴子:12,701,087

别再讨论找工作了,来讨论个技术问题吧

只看楼主收藏回复

小弟最近在学习ArrayBlockingQueue的时候,遇到了一个成员变量ReentrantLock成员变量何时初始化的疑惑,请看下图


IP属地:上海1楼2024-04-03 03:03回复



    IP属地:上海2楼2024-04-03 03:07
    回复
      我想不明白源码里面调用构造方法进行初始化的优点在哪里啊,我感觉我在加载类的时候进行初始化不是更简单易懂吗


      IP属地:上海3楼2024-04-03 03:09
      回复
        有哪位大神解惑一下,小弟先行多谢了


        IP属地:上海4楼2024-04-03 03:10
        收起回复
          是因为在类加载的时候初始化,容易导致堆内存浪费吗?(万一加载了类,但是没有用到类对象这种情况)


          IP属地:上海5楼2024-04-03 03:11
          收起回复
            懒加载啊


            IP属地:浙江来自iPhone客户端6楼2024-04-03 04:34
            回复
              而且你这个也不是类加载的时候初始化 不是static变量 创建对象的时候才会初始化


              IP属地:浙江来自iPhone客户端7楼2024-04-03 04:35
              回复
                懒加载,面向对象编程要考虑性能上,你这样写的代码是存放在元空间的,如果代码量增加的话会出现oom问题


                IP属地:上海来自Android客户端8楼2024-04-03 05:58
                收起回复
                  因为有参构造的参数传fair了,和对象创建时默认初始化的lock肯定不一样啊,那不就得重新创建


                  IP属地:上海来自Android客户端9楼2024-04-03 09:22
                  收起回复
                    没啥区别,习惯问题


                    IP属地:北京来自Android客户端10楼2024-04-03 09:26
                    收起回复
                      这应该是你要的答案
                      注意理解 对于JVM来说 你直接 new 和你在构造里 new 是没区别
                      有区别是成员变量的type 是否是静态的 这影响 Jvm加载类和实例化属性的逻辑
                      我们可以证明出来。

                      我们看看它的字节码(字节码是直接可以表示JVM的加载逻辑的)

                      结论就被证明了。


                      IP属地:湖北11楼2024-04-03 09:38
                      回复
                        至于为什么JVM要这么做 上面已经给了答案了 懒加载是结果 。
                        但更细的原因是Java为了解决 对象中循环引用的情况
                        例如 A对象中依赖B ,B 中依赖A 那么Jvm 加载A时 会发现A <-> B 存在依赖。
                        那么怎么解决这问题呢 ? 那就不完全实例化 也就是说A 只是被加载 但不完全或者说是不成熟
                        JVM会首先将两个类都加载进内存,但此时两个类都还没有被完全初始化,
                        此时并不会触发类的初始化,
                        这样,即使A类和B类相互依赖,JVM也能确保它们都能被加载而不会发生错误或无限循环。


                        IP属地:湖北13楼2024-04-03 09:46
                        回复
                          它要等参数


                          IP属地:广东来自Android客户端14楼2024-04-03 09:59
                          回复
                            jvm类加载原则就是按需加载
                            类加载过程的初始化阶段,只会执行静态变量的初始化和静态代码块。


                            IP属地:浙江来自Android客户端15楼2024-04-03 14:36
                            回复
                              类加载会执行的是static代码块……而且你这new对象,为什么会想到类加载的时候new?难道你只想这个类全局只存在一个锁对象?
                              先把概念理清楚,这个问题就不是个问题……


                              IP属地:广东来自Android客户端16楼2024-04-03 19:29
                              回复