原题大致如下:定义一个变量i,使while( (i+1) == (i+1)){}能够跳出循环,并说明理由。

百度了下发现并没有这道题的讲解,于是我就来献丑啦

经过两天的查阅资料以及测试,得出了两种可行的方法。

一、利用java对字符串拼接操作符"+"的重载

String通过运算符"+"进行拼接,会创建一个临时的StringBuilder对象进行字符串处理.

比如: String a = "abc"+1;    就相当于 String a = new StringBuilder("abc").append("1").toString();

来看StringBuilder对象的toString()方法:

可以看到toString()方法返回的是new String()在堆中创建了新的String对象,所以会跳出循环。

具体代码执行如下:

通过javap 反编译这个类的class文件,如图

红框框的部分也就验证了上面所说。

二、利用多线程来使非原子操作变成线程不安全

while((i+1) == (i+1)){}是一个比较常见的竞态条件(在并发编程中,由于不恰当的执行时序而出现不正确的结果的情况称为竞态条件)类型——"先检查后执行",即通过一个可能失效的观测结果来决定下一步动作。

先上代码:

package com.bckj;/*** Created by DoodleJump on 2017/6/2.*/
public class Test {static int i = 0;public static void main(String[] args) {Runnable td = new Td();Thread td1 = new Thread(td,"thread1");Thread td2 = new Thread(td,"thread2");td1.start();td2.start();while((i+1) == (i+1)){System.out.println("循环中");}System.out.println("循环结束");System.out.println("终止其余线程");td1.stop();td2.stop();}
}class Td implements Runnable{@Overridepublic void run() {while(true){synchronized (this) {Test.i++;}}}
}

再通过javap来看看这段代码中的while((i+1) == (i+1))的字节码

红框框的部分大致意思:

getStatic  #9 //读取类变量i的值,并放入栈顶

iconst_1   //把值1放入栈顶

iadd         //将栈顶的两个元素除栈并进行相加,结果放入栈顶

if_icmpne  66//比较栈顶两int型数值大小,当结果不等于0时跳转到66

这样就可以更好的理解了,我们就是通过创建新的线程在读取完第一个(i+1)的时候抢占主线程,并让i++,这样两边的(i+1)自然不相等,不过这样做的话有点看运气,毕竟线程的顺利抢占并不是每次都能如意,可能有时候可能执行一会儿时间才会跳出循环。

水平有限,就弄出这两种方法,如果有想出别的法子的,可以一起交流,共同进步!

笔试题while((i+1) == (i+1)){}引发的思考相关推荐

  1. 一道笔试题引发的Promise笔记

    前言 近来参加校招笔试,发现有好几道关于Promise的题目.然而我都没有了解过.所以,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事. 文章地址:http://lsxj615.com ...

  2. [c#基础]关于try...catch最常见的笔试题

    引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...

  3. 30K 月薪运维工程师面试考什么?滴滴17年春招笔试题

    转眼之间已经进入了18年2月份.每年的2.3月份,工程师们就会迎来新一波的跳槽高峰.为了拿到更高的薪资,好好准备笔试.面试当然是重中之重. 今天小编为大家整理了去年滴滴春招的笔试题,快来试试自己能不能 ...

  4. 邮政社招笔试题库_工商银行招聘考试题库13套和参考答案

    目录: 1. xx工商银行招聘面试题(笔试真题) 2. 中国工商银行xx分行招聘笔试题无答案(行测部分) 3. 中国工商银行客户经理招聘笔试题和答案 4. 中国工商银行总行校园招聘笔试题和参考答案(行 ...

  5. python笔试题(1)

            为了充实自己,小编决定上传自己见到的笔试题和面试题.可能要写好长时间,一时半会写不了多少,只能说遇到多少写多少吧,但是只要小编有时间,会持续上传(但是答案却不能保证,所以有看到错误的及 ...

  6. [转载] Java笔试题集锦

    参考链接: 关于Java中文件名和类名的误解 Java笔试题集锦 1.MVC的各个部分都有那些技术来实现?如何实现? 答:MVC是Model-View-Controller的简写."Mode ...

  7. 剑指Offer——迅雷笔试题+知识点总结

    剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...

  8. Java面试题(一)100家大公司java笔试题汇总

    Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...

  9. JAVA面试、笔试题

    @[TOC]目录 JAVA面试.笔试题 @目录 一. CoreJava部分 7 1. java中有哪些基本类型? 7 2. java反射 7 3. 易错,理解题 7 4. Java有几种创建对象的方法 ...

最新文章

  1. EasyUI datagrid动态加载json数据
  2. 计算机网络数据分析报告,贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式...
  3. map分组后取前10个_人口净流入排名前10的城市,在这10个城市买房,只涨不跌
  4. python模块的分类有哪些_python之模块分类(六)
  5. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Circle
  6. perl中q,qq,qw,qr的区别。
  7. c ajax传递多个参数,c# – 使用jQuery AJAX将字符串数组传递给具有可变参数数量的webmethod...
  8. [特约· Keso ·东拉西扯] 我眼中的乔布斯
  9. 华为机试HJ50:四则运算
  10. Python sys 使用说明
  11. ijkplayer框架深入剖析
  12. 基于Multisim的MC1496调幅电路的仿真
  13. 修改dns服务器转发器,域服务器dns设置转发器
  14. Java 版本中文数字转阿拉伯数字实现
  15. Banner轮播图的基本使用
  16. MAC 解压 rar 文件
  17. ubuntu 64bit 兼容运行32bit 的方法
  18. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo
  19. Java面试基础知识III
  20. python+appium 实现抖音自动化浏览

热门文章

  1. 哥们,好东西一起分享,这是新地址:http://elves.cnblogs.com/
  2. 【PySpark】<Big Data>Spark概述
  3. 算法基础知识总结(基础算法)
  4. 3. iphone项目如何联机调试和发布程序(99$)
  5. ISO 16750.3-2012道路车辆电子电气部件的环境试验 第三部分
  6. 商用密码应用与安全性评估要点笔记(密码发展、密码算法)
  7. xxl-job remoting error(Connection reset), for url : http://218.66.91.50:7969/run
  8. java医院挂号代码_基于SSM开发的Java医院预约挂号系统 源码下载
  9. 一个简单的视频播放器
  10. 为什么百度知道章子怡的老公是汪峰?点击教你AI智能技术!