`
withyou
  • 浏览: 456729 次
社区版块
存档分类
最新评论

看不见的锁 -- 对小程序的运行结果的解释

阅读更多

From: http://blog.sina.com.cn/u/4ad4a32e0100069e 

在以前的文章中,我提到一个有趣的小程序,现在就对它的行为做一解释。为方便起见,将那段代码重抄~如下:

class Init{
        static volatile boolean done = false;
        static {
                new Thread() {
                        public void run() {
                                System.out.println("enter thread");
                                done = true;
                        }
                }.start();

                while(!done);
        }
        public static void main(String[] args) {}
}

这个小程序不会终止。其主线程会陷入死循环,那个单独的线程会永远等待。为方便起见,称主线程为M,单独的线程为N。代码的执行过程大体如下:

1. M看到类Init, 获取Init.class上的锁,判断初始化是否正在进行,或着已完成。

2. 此时初始化既未进行,也未完成,于是M设一个标志表示初始化正在进行,然后释放Init.class上的锁

3. M开始初始化类Init, 完成对Init.done的初始化

4. M进入static块,启动N, 进入while循环

5. N开始运行,打印出"enter thread",

6. N看到Init.done, 这是N第一次看到类Init, 所以像M一样,试图初始化Init。

7. 与步骤1类似,N 成功获取Init.class上的锁

8. N发现M所设的初始化正在进行的标志,N就释放Init.class的锁,并进入等待状态。

9. 由于N在等待,Init.done一直为false,M就一直在while中循环,不能退出static块.

10. 由于M对Init的初始化不能完成,所以N不能得到M的通知而退出等待。

可见,这是一个M和N的死锁问题。

一般而言,只要N引用类本身或类的成员,包括任何method或field,N都会先去初始化这个类从而陷入死锁。

但是有例外,例如如果N引用的是一个常变量(constant variable),N 就不会去初始化这个类,例如如果Init有以下成员,  引用它就可以。

final boolean ok = false;

还有一个例外,以下语句出现在run()中也不会引发Init的初始化.

Init C = null;

以上所描述的答案和例外都可以在Java的语言规范中找到依据,有兴趣的人可以看看

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.4

最后,有两个建议给大家:一是不要写这种晦涩的代码,一般而言,水平最高的代码是那种简洁易懂,使~人一望而知的代码,所谓洗尽铅华,归于平淡;二是万一遇到这样的代码,想彻底弄懂它,可以读一读Java语言规范和虚拟机规范,这两本书可是我们的倚天、屠龙。

分享到:
评论

相关推荐

    手势解锁-html-微信小程序

    2. **样式适配**:由于微信小程序运行在移动端,需要考虑不同设备的屏幕尺寸,使用百分比或小程序的`rpx`单位进行布局。 3. **错误处理**:设置错误提示和重试机制,如果用户绘制的路径不正确,应给出反馈并允许用户...

    小程序--自动开锁源码

    小程序是一种轻量级的移动应用程序,它不需要用户下载安装即可使用,通常通过微信、支付宝等平台运行。小程序的开发基于特定的框架,如微信的小程序开发框架WXML和WXSS,它们提供了一套自定义的标记语言和样式语言,...

    PC微信小程序解锁工具

    4. **模拟器**:通过模拟器,用户可以不依赖于真实设备就能在模拟环境中测试小程序,这对于开发者来说是非常方便的,他们可以快速模拟不同设备和环境下的小程序运行状态。 5. **数据抓取**:数据是小程序分析和优化...

    微信小程序-手势解锁密码源码

    由于微信小程序的服务器部署要求开发者具备一定的基础,源码包的说明文档中也可能会包含对服务器搭建的基本指导,比如环境配置和API接口设置等,从而确保开发者能够顺利地将应用部署到服务器上。 这套资源对于有志...

    122-微信小程序-手势解锁.zip

    微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,为用户提供便捷的、无需下载安装即可使用的在线服务。"122-微信小程序-手势解锁.zip"这个压缩包显然包含了关于如何在微信小程序中实现...

    PHP实例开发源码—龙兵微信开锁换锁小程序模板源码 PHP版.zip

    【PHP实例开发源码—龙兵微信开锁换锁小程序模板源码 PHP版.zip】是一个包含PHP编程语言的微信小程序开发模板,适用于创建基于微信平台的开锁换锁服务应用。这个压缩包提供了完整的源代码,让开发者可以深入理解如何...

    电子密码锁-带源程序电路图和pcb.rar

    总的来说,"电子密码锁-带源程序电路图和pcb.rar"项目为我们提供了学习和实践STM32、ARM架构以及嵌入式硬件设计的宝贵资源。通过理解并实践这个项目,开发者不仅可以掌握电子密码锁的工作原理,还能提升在嵌入式领域...

    非常小巧的挂机锁-绿色免安装

    标题中的“非常小巧的挂机锁-绿色免安装”指的是这款软件体积小,不占用大量系统资源,并且不需要经过复杂的安装过程,用户可以直接运行。挂机锁是一种安全工具,主要功能是在用户离开计算机时锁定系统,防止他人...

    TouchWin 定时锁机小程序

    对于程序的具体安装和操作,SYSLOCK_P_V1.1.0.160530.2.txp文件可能作为程序安装包或更新文件,这是确保定时锁机小程序顺利运行的重要组件。文件名中的“SYSLOCK_P”很可能代表“系统锁”功能,而紧随其后的数字和...

    西门子PLC S7-300/400程序块加锁解锁方法

    被加锁的程序块在SIMATIC管理界面中会显示一把小锁图标,这意味着这些程序块不能被修改或查看详细内容。这样一来,未经许可的人无法轻易查看或更改程序块内的代码,保护了程序的完整性和安全性。 当需要对这些带锁...

    三菱FX系列PLC 时间锁机程序教程 和记数限制PLC程序运行 停机控制教程视频.zip

    在本教程中,我们将深入探讨如何利用三菱FX系列PLC实现时间锁机功能以及计数限制PLC程序运行的停机控制。 1. **三菱FX系列PLC**:这是三菱电机推出的一系列小型可编程逻辑控制器,广泛应用于各种自动化设备中。FX...

    微信小程序设计-手势解锁.zip

    9. **适配不同设备**:由于微信小程序需要在多种设备上运行,开发者需确保手势解锁功能在不同屏幕尺寸和分辨率的手机上都能正常工作。 综上所述,这个压缩包可能包含了实现微信小程序手势解锁功能的详细步骤、代码...

    浅谈微信小程序.pdf

    用户只需通过微信扫一扫或搜索,即可打开所需的小程序,使用完毕后即刻关闭,不占用后台资源。 【小程序的特点与优势】 1. **轻量化**:小程序无需下载安装,节省了用户的手机存储空间,同时也避免了应用程序更新...

    微信小程序仿ofo共享单车小程序源码(源码+源码导入视频教程+源码导入文档教程)小程序精选源码亲测可用

    微信小程序是一种轻量级的应用开发平台,主要用于在微信内部运行,提供给用户便捷的服务体验。本资源是关于仿造ofo共享单车的小程序源码,它包括了完整的源代码、视频教程以及图文文档教程,旨在帮助开发者更好地...

    门锁_小程序_

    5. **数据安全**:由于涉及到用户的隐私和家庭安全,小程序必须确保数据传输的安全性,采用加密技术保护用户信息不被泄露。 6. **售后服务**:企业展示小程序可能还包含售后服务部分,如故障申报、维修预约、使用...

    微信小程序一键解密工具.zip

    该“微信小程序一键解密工具”就是这样的辅助软件,它可以快速地对wxapkg文件进行解密,使得开发者能够看到源代码级别的信息,便于调试、优化或者学习小程序的实现方式。使用这个工具,可以显著提高开发效率,特别是...

    透明挂机锁-网吧一样的

    6. **占用资源少**:设计上注重轻量化,对计算机性能的影响极小,不影响其他程序的正常运行。 为了更好地使用透明挂机锁,用户需要了解以下几点: 1. **安装与配置**:下载并运行压缩包内的“透明挂机锁.exe”文件...

    西门子S7-200的定时停机加密程序样例

    - 解释如何将加密程序下载到S7-200 PLC,并进行测试和验证。 - 可能还包含了一些故障排查和维护的建议,以确保程序的稳定运行。 学习这个样例,可以帮助工程师了解如何在实际项目中结合定时控制和加密技术,提升...

    龙兵微信开锁换锁小程序模板源码 PHP版 v1.0.zip

    【标题】"龙兵微信开锁换锁小程序模板源码 PHP版 v1.0" 是一款基于PHP开发的微信小程序应用模板,专为提供开锁换锁服务的企业或个人设计。这款源码允许开发者快速构建自己的微信小程序,方便用户通过微信平台预约和...

    2021年新变现小程序源码 虚拟资源变现知识付费小程序+激励广告流量主

    资源分享小程序为网络资源分享类自媒体解决变现与传播问题,小小的资源,要钱不合适,不要钱又不能用爰发电,让用户分享又没有效果,那么我们就可以让用户打开小程序,看一段广告,直接获取资源,是不是共赢呢?...

Global site tag (gtag.js) - Google Analytics