首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Effective Java 第二版 学习笔记(4) 消除过期对象的引用 避免使用终结方法

内存泄漏的一个来源是缓存,一旦把对象放到缓存中,就很容易被遗忘掉,从而使得它不再有用之后仍然很长一段时间内留在缓存中。...记住只有当所要缓存的项的生命周期是由该键的外部引用不是由值决定时,WeakHashMap才有用。 内存泄漏的另一个来源是监听器和其他回调。...如果实现了一个API,客户端在这个API中注册回调,却没有显式地取消注册,除非采取某些动作,否则就会积聚。确保回调立即被当做垃圾回收的最加方法就是只保存它们的弱引用。...Java语言规范不仅不保证终结方法会被及时地执行,而且根本就不保证它们会被执行。不应该依赖终结方法来更新重要的持久状态。...如果本地对等体拥有必须被及时终止的资源,那么该类就应该具有一个显式的终止方法。

49820

(修订)一道百度面试题的多种解法

是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(不是用作互斥的作用)。...CountDownLatch的不足 CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用...,然后这一组线程再同时执行; 另外,CountDownLatch是不能够重用的,CyclicBarrier是可以重用的。...变量这个时候在类的内部初始化一个int的变量,每当我们调用countDownt()方法的时候就使得这个变量的值减1,而对于await()方法则去判断这个int的变量的值是否为0,是则表示所有的操作都已经完成,否则继续等待...实际上如果了解AQS的话应该很容易想到可以使用AQS的共享式获取同步状态的方式来完成这个功能。CountDownLatch实际上也就是这么做的。

36820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Node.js的事件循环(Event loop)、定时器(Timers)和 process.nextTick()

    否则这个 close 事件将通过 process.nextTick() 发送。...process.nextTick() 理解 process.nextTick() 也许你注意到了尽管 process.nextTick() 是异步 API 的一部分,但是它不在之前的循环图里。...一部分是因为这是一种设计理念,即 API 即使在不需要的地方也应该始终是异步的。...process.nextTick() 在同一阶段立刻执行 setImmediate() 在事件循环的下一迭代或 tick 里执行 从本质上来看它们的名字应该交换下比较好。...除非将主机名传递给这个端口,否则这些将立即发生。此时事件循环要继续下去的话必须到达轮询阶段,这意味着需有一个连接在 listening 事件之前触发。

    1.5K30

    面试5年25K程序员回答不出来为什么Java的main方法必须是public static void?

    虽然这个面试题算偏题怪题,不作为扣分项,但还是应该掌握和了解。...当然,很多人首先学的是 C 和 C++,但是在 Java 中 main 方法与前者有些细微的不同,它不会返回任何值,为什么 main 方式是 public、static、void,这篇文章尝试去找到一些答案...4.静态方法和静态数据加载到内存就可以直接调用不需要像实例方法一样创建实例后才能调用,如果 main 方法是静态的,那么它就会被加载到 JVM 上下文中成为可执行的方法。...总结 1.main 方法必须声明为 public、static、void,否则 JVM 没法运行程序 。...10.静态初始化块在 JVM 调用 main 方法前被执行,它们在类被 JVM 加载到内存的时候就被执行了。

    45530

    Java 中处理异常的 9 个实践

    当你在 try 子句中打开资源时,它将在 try 被执行后自动关闭,或者处理一个异常。...因此,应该尽可能准确地描述问题,并提供相关的信息来了解异常事件。 别误会,你不需要写一段文字,而是应该用 1-2 个简短的句子解释异常的原因。...开发人员可能非常确信它不会被抛出,并添加一个无法处理或无法记录它的catch 语句。当你发现它的时候,你很可能就会明白一句著名的话“This will never happen”。...有些人可能会删除阻止异常事件的验证,没有意识到这造成了问题。或者抛出异常的代码被更改,现在抛出了同一个类的多个异常,调用的代码并不能阻止所有这些异常。...否则,你将丢失原始异常的堆栈跟踪和消息,这将使你很难分析导致异常的事件。

    49810

    Spring的核心思想,总结得非常好

    如上代码清单所示,Coder使用Java语言打印helloworld字符串, 在这里它不但依赖Language接口, 还依赖Java类,这使得它和Java类耦合在一起。...我们给Coder类增加了设置具体语言的方法,使得Coder类只依赖Language接口不依赖具体的语言实现,换言之,Coder类和具体的语言解耦了,此时我们可以轻而易举的使用其它语言代替Java,比如说使用...在我们的代码清单中,创建对象和设置依赖关系的main方法只适用与当前的情况,Spring的IOC容器能适用与任何情况 通常,Spring的依赖关系由XML表示,IOC容器解析XML完成对象的创建和依赖注入...@Before注解 @Before注解修饰的方法会在被增强的方法执行前被执行 @After注解 @After注解修饰的方法会在被增强的方法执行后被执行 @AfterReturning注解 @AfterReturning...注解修饰的方法会在被增强的方法执行后被执行,但前提是被修饰的方法顺利执行结束,假如方法中途抛出异常,那么AfterReturning注解修饰的方法将不会被执行After注解修饰的方法是无论如何都会被执行

    53210

    try..catch 不能捕获的错误有哪些?注意事项又有哪些?

    用于抛出自定义错误 catch块处理捕获的错误 finally 块是最终结果无论如何,都会执行的一个块,可以在这个块里面做一些需要善后的事情 1.1 try 每个try块必须与至少一个catch或finally块,否则会抛出...Error while executing the code 1.2.1 try..catch 与 无效代码 try..catch 无法捕获无效的 JS 代码,例如try块中的以下代码在语法上是错误的,但它不会被...$%^&* } catch(err) { console.log("这里不会被执行"); } ➤ ⓧ Uncaught SyntaxError: Invalid or unexpected token..."); } 未捕获的ReferenceError将在1秒后引发: ➤ ⓧ Uncaught ReferenceError: noSuchVariable is not defined 所以 ,我们应该在异步代码内部使用...Error caught by outer block: ➤ ⓧ Error while executing the code 1.3 try..finally 不建议仅使用 try..finally 没有

    2.6K20

    Redis:17---常用功能之(事务)

    例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况 Redis只提供了四个命令管理事务...如果使用了WATCH,DISCARD将取消监视连接监视的所有键 EXEC:提交一个事务 所以Redis的事务比较简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算,当然也体现了...因为key被其他客户端修改,所以EXEC返回nil,事务没有被执行。然后获取key,key没有被改变 ?...,但只有成功入队的SET命令 和GET命令被执行了,错误的YAH000O则被忽略了: redis> MULTI OK redis> SET msg "hello" QUEUED redis> YAH000O...如果找不到可供使用的AOF文件,那么重启之后的数据库将是空白的,空白数据库总是一致的 综上所述,无论Redis服务器运行在哪种持久化模式下,事务执行中途发生的停机都不会影响数据库的一致性

    49930

    Java 处理异常 9 个最佳实践,你知道几个?

    当你在try子句中打开资源时,它将在try被执行后自动关闭,或者处理一个异常。...因此,应该尽可能准确地描述问题,并提供相关的信息来了解异常事件。 别误会,你不需要写一段文字,而是应该用1-2个简短的句子解释异常的原因。...开发人员可能非常确信它不会被抛出,并添加一个无法处理或无法记录它的catch语句。当你发现它的时候,你很可能就会明白一句著名的话“This will never happen”。...有些人可能会删除阻止异常事件的验证,没有意识到这造成了问题。或者抛出异常的代码被更改,现在抛出了同一个类的多个异常,调用的代码并不能阻止所有这些异常。...否则,你将丢失原始异常的堆栈跟踪和消息,这将使你很难分析导致异常的事件。

    37130

    Java 处理异常 9 个最佳实践,你知道几个?

    当你在try子句中打开资源时,它将在try被执行后自动关闭,或者处理一个异常。...因此,应该尽可能准确地描述问题,并提供相关的信息来了解异常事件。 别误会,你不需要写一段文字,而是应该用1-2个简短的句子解释异常的原因。...开发人员可能非常确信它不会被抛出,并添加一个无法处理或无法记录它的catch语句。当你发现它的时候,你很可能就会明白一句著名的话“This will never happen”。...有些人可能会删除阻止异常事件的验证,没有意识到这造成了问题。或者抛出异常的代码被更改,现在抛出了同一个类的多个异常,调用的代码并不能阻止所有这些异常。...否则,你将丢失原始异常的堆栈跟踪和消息,这将使你很难分析导致异常的事件。

    40230

    Python 学习之异常

    当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行 造成异常的原因:1. 程序编写有问题造成,产生 Bug ,必须处理 2. 用户输入造成的 3....为了使程序遇到问题时不让程序结束,越过错误继续向下执行。...print("代码没有问题") print("程序继续执行") except 常规异常的基类2 try: print(4 / 0) except: # 使用 except 捕获常规错误,不使用任何的错误类型...ZeroDivisionError 或 NameError") 特殊情况3 """ 特殊: 1.错误其实是 class(类),所有的错误都继承自 BaseException,所以在 捕获的时候,它不仅捕获了该类型的错误...") try: print(1 / 0) finally: print("finally是一定会被执行的") print() 语句调试5.1 """ 通过 print()

    50930

    var、let和const之间的区别

    defined console.log(c) // c is not defined 有无变量提升 var有变量提升, let和 const没有变量提升 即 let和 const不需要先声明,再使用,否则会报错..., var不需要先声明再使用,可以先使用后声明,不会报错,不过赋值的时候,值一直是 undefined console.log(a) // undefined console.log(b)...也就是说: 从广义上来说, let和 const没有变量提升,因为在声明前使用会报错 从狭义上来说, let和 const是有变量提升的,因为实际上用它们定义的变量已经被执行上下文记住了,否则应该会报错...let和 const究竟有没有变量提升取决于怎么定义变量提升: 如果变量提升指的是变量可以在声明前使用,则没有变量提升 如果变量提升指的是变量在声明前有没有被执行上下文记住的话,则是有变量提升的。...问题来了:使用var声明的变量也会绑定到全局对象上,为什么它不能被delete掉呢?

    1.3K10

    Java中final、finally、finalize的区别与用法

    A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract抽象类的和final的类。...finally结构使代码总会执行,不管无异常发生。使用finally可以维护对象的内部状态,并可以清理非内存资源。...用final修饰的变量(常量比非final的变量(普通变量拥更高的效率,因此我们在际编程中应该尽可能多的用常量来代替普通变量。...System.out.println(“父类–这是一个final方法”); } } public class SubClass extends ParentClass{ //子类无法重写(override父类的final方法,否则编译时会报错...System.out.println(ft.i); } } 复制代码 运行上面的代码试试看,结果是99,不是初始化时的10。 finally语句 接下来我们一起回顾一下finally的用法。

    34620

    处理Java异常的9个最佳实践

    因此,总是尝试找到最适合你的异常事件的类,例如抛出NumberFormatException不是IllegalArgumentException。并避免抛出非特定的异常。...问题是只有匹配异常的第一个catch块才会被执行。...你可以在catch子句中使用它,但你永远不应该这样做! 如果在catch子句中使用Throwable,它不仅会捕获所有异常; 它还会捕获所有错误。JVM抛出错误以指示应用程序无法处理的严重问题。...有人可能会删除阻止异常事件的验证不会认识到这会产生问题。或者抛出异常的代码会被更改,现在抛出同一个类的多个异常,并且调用代码不会阻止所有这些异常。...否则,你将丢失原始异常的堆栈跟踪和消息,这将导致难以分析导致异常的异常事件。

    76550

    【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    因为任何阶段相关的操作都可能导致更多的待执行操作产生,新事件会被内核添加进poll队列中,当poll队列中的回调函数被执行时允许继续向当前阶段的poll队列中添加新的回调函数,于是长时间运行的回调函数可能就会导致事件循环在...事件循环细节 timers 一个timer会明确一个时间点,回调函数会在时间超过这个时间点后被执行不是开发者希望的精确时间。...否则(其他形式触发的关闭)事件将会通过process.nextTick( )来发送。  ...如果将回调函数替换为process.nextTick( )的形式,脚本中剩余的代码就可以执行完毕,这就使得变量和函数的初始化语句可以优先于传入的回调函数被执行,这样做的另一个好处是它不会推动事件循环前进...除非传入hostname,否则端口不会被绑定。

    1.2K30

    《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective

    ,其他规则不会再被执行。...在规则运行时,引擎会拿当前操作系统的时间与date-effective设置的时间值进行比对,只有当系统时间大于等于date-effective设置的时间值时,规则才会触发执行,否则执行将不执行。...例如2017 年7 月20 日,在设置为date-effective值时,如果操作系统为英文的,那么应该写成“20-Jul-2017”;如果是中文操作系统则为“20-七月-2017”。...可以通过设置drools的日期格式化来完成任意格式的时间设定,不是使用默认的格式。...引擎在执行规则时会检查属性是否设置,如果设置则比较当前系统时间与设置时间,如果设置时间大于系统时间,则执行规则,否则不执行。实例代码同样参考date-effective。

    853100
    领券