Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
zhh-4096 2019-10-19 04:05:18 发布的技术动态 - OurCoders (我们程序员)
zhh-4096
2019-10-19 04:05:18 发布
睡醒了,修了个隐藏了很多年的低级bug : 网页链接 就像链接中的代码所示,常常遇到那种只想让某个方法只调用一次的场景。

有两种常见的做法:

第1种就是弄个holder类,然后在里面弄个static final类型的字段,通过调用某个只想执行一次的方法给它赋值,最后再通过static类型的方法访问这个字段,JVM会保证static final字段的初始化是多线程安全的;

第2种用一个boolean字段加一个synchronized方法,调用过了,就把字段设为true。

第2种是最容易错的,就像这个bug那样,什么时候设为true是很关键的,如果并发线程中有依赖这个synchronized方法中设置的东西,还没做就提前设为true了,虽然这个方法确实只调用了一次,但其他线程也读不到想要的东西,所以常遇到NPE问题。