笔试题while((i+1) == (i+1)){}引发的思考
原题大致如下:定义一个变量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)){}引发的思考相关推荐
- 一道笔试题引发的Promise笔记
前言 近来参加校招笔试,发现有好几道关于Promise的题目.然而我都没有了解过.所以,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事. 文章地址:http://lsxj615.com ...
- [c#基础]关于try...catch最常见的笔试题
引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...
- 30K 月薪运维工程师面试考什么?滴滴17年春招笔试题
转眼之间已经进入了18年2月份.每年的2.3月份,工程师们就会迎来新一波的跳槽高峰.为了拿到更高的薪资,好好准备笔试.面试当然是重中之重. 今天小编为大家整理了去年滴滴春招的笔试题,快来试试自己能不能 ...
- 邮政社招笔试题库_工商银行招聘考试题库13套和参考答案
目录: 1. xx工商银行招聘面试题(笔试真题) 2. 中国工商银行xx分行招聘笔试题无答案(行测部分) 3. 中国工商银行客户经理招聘笔试题和答案 4. 中国工商银行总行校园招聘笔试题和参考答案(行 ...
- python笔试题(1)
为了充实自己,小编决定上传自己见到的笔试题和面试题.可能要写好长时间,一时半会写不了多少,只能说遇到多少写多少吧,但是只要小编有时间,会持续上传(但是答案却不能保证,所以有看到错误的及 ...
- [转载] Java笔试题集锦
参考链接: 关于Java中文件名和类名的误解 Java笔试题集锦 1.MVC的各个部分都有那些技术来实现?如何实现? 答:MVC是Model-View-Controller的简写."Mode ...
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...
- Java面试题(一)100家大公司java笔试题汇总
Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...
- JAVA面试、笔试题
@[TOC]目录 JAVA面试.笔试题 @目录 一. CoreJava部分 7 1. java中有哪些基本类型? 7 2. java反射 7 3. 易错,理解题 7 4. Java有几种创建对象的方法 ...
最新文章
- EasyUI datagrid动态加载json数据
- 计算机网络数据分析报告,贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式...
- map分组后取前10个_人口净流入排名前10的城市,在这10个城市买房,只涨不跌
- python模块的分类有哪些_python之模块分类(六)
- G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Circle
- perl中q,qq,qw,qr的区别。
- c ajax传递多个参数,c# – 使用jQuery AJAX将字符串数组传递给具有可变参数数量的webmethod...
- [特约· Keso ·东拉西扯] 我眼中的乔布斯
- 华为机试HJ50:四则运算
- Python sys 使用说明
- ijkplayer框架深入剖析
- 基于Multisim的MC1496调幅电路的仿真
- 修改dns服务器转发器,域服务器dns设置转发器
- Java 版本中文数字转阿拉伯数字实现
- Banner轮播图的基本使用
- MAC 解压 rar 文件
- ubuntu 64bit 兼容运行32bit 的方法
- 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo
- Java面试基础知识III
- python+appium 实现抖音自动化浏览
热门文章
- 哥们,好东西一起分享,这是新地址:http://elves.cnblogs.com/
- 【PySpark】<Big Data>Spark概述
- 算法基础知识总结(基础算法)
- 3. iphone项目如何联机调试和发布程序(99$)
- ISO 16750.3-2012道路车辆电子电气部件的环境试验 第三部分
- 商用密码应用与安全性评估要点笔记(密码发展、密码算法)
- xxl-job remoting error(Connection reset), for url : http://218.66.91.50:7969/run
- java医院挂号代码_基于SSM开发的Java医院预约挂号系统 源码下载
- 一个简单的视频播放器
- 为什么百度知道章子怡的老公是汪峰?点击教你AI智能技术!