在程序结束后,所有这个程序分配的内存都会自动被处理掉。但如果上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题!...,代码会(通过增加“ptr”)修改while循环里“ptr”存储的地址。...当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量就是传给malloc()的地址。...答:如下: int func(void *ptr) 如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。 7.*和++操作 问:下面的操作会输出什么?...这个操作是无效的,因此会造成seg-fault或者崩溃。 9.返回本地变量的地址 问:下面代码有问题吗?如果有,该怎么修改?
我:我在画CAS的原理,要不我跟你讲一遍? 老婆:好呀! 案例:甲看见一个三角形积木,觉得不好看,想替换成五边形,但是乙想把积木替换成四边形。(前提条件,只能被替换一次) ?...调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作。...四、CAS有什么问题? 不知道大家发现没,aaa线程可能会出现循环多次的问题,因为其他线程可能将主内存的值又改了,但是aaa线程拿到的还是老的数据,就会出现再循环一次,就会给CPU带来性能开销。...频繁出现自旋,循环时间长,开销大(因为执行的是do while,如果比较不成功一直在循环,最差的情况,就是某个线程一直取到的值和预期值都不一样,这样就会无限循环) 只能保证一个共享变量的原子操作 当对一个共享变量执行操作时...,我们可以通过循环CAS的方式来保证原子操作 但是对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候只能用锁来保证原子性 引出来ABA问题(有彩蛋) 五、小结 本篇从和老婆的对话开始,以通俗的语言给老婆讲了
海象算子 这个新算子(:=)能让我们为表达式中的一个变量赋值。这个符号看起来颇有些类似于海象的眼睛和犬齿。...count of records from a database" 多次调用一个高成本的函数 上面的示例是通过多次调用一个高成本的函数 get_count() 来填充一个列表。...有了海象算子的帮助,我们可以避免多次调用函数 get_count(),其具体的功能是将结果存储到一个变量中,然后我们可在后续的计算中复用同一个变量。...每当读取一个分块时,都会检查它的值,并且该值也是 while 循环的终止条件。...由此我们就能避免在 while 循环之外显式地声明变量。
虽然我英语只停留“点头yes,摇头no,来是come,去是go” 的水平,但是我知道next是“下一个”的意思,如果我来命名,会命名为“create”,“generate”,这样不是更“贴切”吗?...现在让我们想一个问题,如果在高并发的情况下,有N个线程,同时执行到第一步:根据老的种子生成新的种子,获得的种子不就一样了吗?由于第二步是根据新的种子来计算随机数,这个算法又是固定的,会产生什么情况?...当有两个线程同时进入到next方法,会发生如下的事情: 线程A,线程B同时拿到了seed的值,赋值给oldseed变量。 根据一个神秘的算法,计算出nextseed为XXX。...大量的线程都在进行while循环,这是相当占用CPU的,所以JUC推出了ThreadLocalRandom来解决这个问题。...,所以多次调用此方法,返回的ThreadLocalRandom对象是同一个。
练习 27:一个猜数字游戏 现在你知道如何使用while循环重复某些内容,我们将编写一个实际上另一个人可能会喜欢运行的程序?你对此和我一样兴奋吗?...如果我们用while循环来做这个,条件会是这样的: while ( again.equals("y") ) { 这是可以的,也可以工作,但是变量again直到第 28 行才得到一个值。...或者可能是三个,可能是五个,我不确定?那么你需要另一种方法。你需要一个循环(这就是我们重复事情的方式),并且你需要一个变量,它将随着值的逐个添加而逐渐增加。...一个从“空白”开始并逐个添加值的变量称为“累加器”变量,尽管这是一个相当古老的词,所以如果你的编程朋友年龄不到四十岁,他们可能从未听说过。...在名称(或“标识符”)showDice 后面,有一组括号,在它们之间声明了一个变量!这个变量叫做“参数”。showDice 函数有一个参数。这个参数是一个整数。它的名字叫 roll。
来,你说这个程序会不会正常结束? ? 但凡是对 Java 并发编程有一定基础的朋友都能看出来,这个程序是一个死循环。...甚至让你觉得:不可能吧?我得亲自操作一下。 操作之后你就会说:卧槽,还真是这样?这是量子力学吗? ? 第一次程序改造 那我把上面这题变一下,改变成下面这样: ?...这次的变动点是在 while 循环里面加了一个 100ms 的睡眠。 来,你再猜一下。这个程序还是不是死循环呢?...(所以有同步操作) 因此,如果使用 System.out.println, JVM 将无法在循环期间缓存变量。 这就是为什么,当有 print 语句时,循环可以正常结束,尽管这不是一个正确的操作。...这时候 CPU 就可能有时间去保证内存的可见性,于是 while 循环可以被终止。 (别说锁粗化了,我觉得这个回答肯定是不对的。)
虽然我英语只停留“点头yes,摇头no,来是come,去是go” 的水平,但是我知道next是“下一个”的意思,如果我来命名,会命名为“create”,“generate”,这样不是更“贴切”吗?...现在让我们想一个问题,如果在高并发的情况下,有N个线程,同时执行到第一步:根据老的种子生成新的种子,获得的种子不就一样了吗?由于第二步是根据新的种子来计算随机数,这个算法又是固定的,会产生什么情况?...当有两个线程同时进入到next方法,会发生如下的事情: 线程A,线程B同时拿到了seed的值,赋值给oldseed变量。 根据一个神秘的算法,计算出nextseed为XXX。...大量的线程都在进行while循环,这是相当占用CPU的,所以JUC推出了ThreadLocalRandom来解决这个问题。...(Thread.currentThread(), PROBE) == 0) localInit(); return instance; } 有一点需要注意,由于current是一个静态的方法,所以多次调用此方法
前言 昨天有朋友反映好多反射知识没说到,所以今天算是补充篇,一起看看反射的进阶知识点。 反射可以修改final类型成员变量吗? final我们应该都知道,修饰变量的时候代表是一个常量,不可修改。...这是为什么呢?为什么String不能被修改,而普通的对象变量可以被修改呢? 先说结论,其实String值也被修改了,只是我们无法通过这个对象获取到修改后的值。...怎么提升反射效率 1、缓存重复用到的对象 利用缓存,其实我不说大家也都知道,在平时项目中用到多次的对象也会进行缓存,谁也不会多次去创建。...ASM是一个通用的Java字节码操作和分析框架。它可以用于修改现有类或直接以二进制形式动态生成类。 简单的说,这是一个类似反射,但是不同于反射的高性能库。...「小总结:」经过上述三种方法,我想反射也不会那么可怕到大大影响性能的程度了,如果真的发现反射影响了性能以及实际使用的情况,也许可以研究下,是否是因为没用对反射和没有处理好反射相关的缓存呢?
当 a b 都是基本类型变量时,a += b 和 a = a + b 的效果有区别吗? A. 当 a 和 b 的类型不同时,那两条语句的效果就可能有区别。...但是第二种写法更好,因为它限制了变量的作用域。 2.1 函数调用 Q. 当把数组当作函数调用时的参数时,我常常感到疑惑? A. 是的。...因为这个原因,绝大多数变成语言支持把数组传入函数但不复制一个副本——MATLAB语言除外。 2.3 递归调用 Q. 有没有只能用循环而不能用递归的情况? A....不可能,所有的循环都可以用递归替代,虽然大多数情况下,递归需要额外的内存。 Q. 有没有只能用递归而不能用循环的情况? A. 不肯能,所有的递归调用都可以用循环来表示。...JAVA对于栈的实现就是一个典型的宽接口的例子。 Q. 我想使用数组来表示一个包含泛型的栈,但是以下代码编译报错。为什么? A. 不错的尝试。不幸的是,创建一个泛型数组在 Java 1.5里不支持。
(就像有两个名叫“迈克尔”的朋友。只是因为他们有相同的名字并不意味着他们是同一个人。) 变量b(在第 27 行定义)的值作为函数调用中参数base的初始值传入。...这是因为它试图从一个名为name-and-numbers.txt的文本文件中读取,这个文件必须与你的代码在同一个文件夹中。你可能没有这样的文件!...用您惊人的幸运连胜给朋友留下深刻印象! 练习 44:使用 for 循环计数 正如您在以前的练习中看到的,while循环和 do-while 循环可以用来多次执行某些操作。...第二部分(n <= 5)是一个条件,就像while或 do-while 循环的条件一样。for循环是一个前测试循环,就像while循环一样,这意味着在循环开始之前会测试这个条件。...大多数学生希望通过在循环内部放置另一个if语句(或else)来解决这个问题,以表明“未找到”。但这是行不通的。如果我想知道是否找到了某物,那么一旦我找到它,就可以这样说。
1.gets()函数 问:请找出下面代码里的问题: ? 答:上面代码里的问题在于函数gets()的使用, 这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积, 这可能会导致缓存溢出。...但如果上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题! 提示:如果你想知道更多关于内存泄漏的知识和内存泄漏检测工具,可以来看看我们在Valgrind上的文章。...当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量就是传给malloc()的地址。...答:如下: int func(void *ptr) 如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。 8....11.返回本地变量的地址 问:下面代码有问题吗?如果有,该怎么修改? ? 答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。
我再来考考你,在程序中有一个变量a,当a的值为1的时输出“我是第1行”,当a的值为2时输出“我是第2行”,当a的值为3时输出“我是第3行”,已此类推,一直到第5行! 不要低估了我的智商!看我的! ?...小伙儿,我们来玩耍一个新的游戏——输出10000行,“猿人工厂,我爱你” 猿人工厂君,你—— 机智如我怎么可能被难倒?...表达式3:给初循环变量做增量或者减量,以达到控制循环体执行次数的目的。 下面给出一个例子,计算从1到100的整数和。 ? 循环语句2--while 100以内的整数和还可以这样写 ?...所谓方法,就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。 方法的定义 ?...我们看下面这个例子:计算长方形的面积 ? 那怎么调用呢? ? 那如果我想保留计算结果,被其它地方使用怎么办? ?
你可以在下表中看到一些特性比较: PDO MySQLi 数据库支持 12 种驱动 只有 MySQL 范例 OOP 过程 + OOP 预处理语句(客户端侧) Yes No 1命名参数 Yes No 现在我想对于大多数开发人员来说...我们创建了 DSN 变量,DSN 变量只是一个保存数据库信息的变量。...最后,你可以创建一个 PDO 类的实例,我使用了 conn 变量,并提供了 dsn、user、pass 参数。...然后我们运行一个 while 循环并创建了一个 row 变量来从 tis 对象中获取内容,最后通过调用列名来显示每一行。 很简单,不是吗?现在让我们来看看预处理语句。...由于没有位置绑定,因此在多次使用相同变量的查询中非常有效。
它缺少某些被认为是其他语言不可或缺的组成部分的结构,例如广泛的标准库、不变性和宏。但在我看来,有一个细节没有得到足够的重视——发电机。...在本文中,我想解释迭代器和生成器的可能用例,以及它们如何改进代码的冗长性。...在下一次next调用中,传递给函数的值将设置reset变量的值。但是第一次next调用中传递的值会发生什么变化?它无处可去!如果需要将初始值传递给生成器,可以通过生成器的参数来实现。...此外,我们还了解了生成器,这是一种方便地实现迭代器的语法结构。 尽管在本文中,我提供了带有数字序列的示例,但 JavaScript 中的迭代器可以解决范围广泛的任务。...在下一篇文章中,我想讨论如何使用生成器来构建异步进程(协同程序、goroutines、CSP 等)。
B: new MyObject() A: 如果想创建另一个对象, 就再次new MyObject()? B: 是的 A: 所以说我们有某个类, 我们就可以对它实例化很多次?...这是个鸡和蛋的问题: 我可以使用MyClass里面的构造函数, 但是我无法实例化这个对象, 因为其他的类无法使用 "new MyClass()"....类图: 其他问题 上面巧克力锅炉那道题你可能写好了, 但是可能会出现这个问题: 锅炉可能在里面有液体的情况下又进行了fill填充动作. 这是怎么回事? 是不是其他线程引起的这个问题?...我们可能有两个线程都在执行这段代码: image.png 那么两个线程调用时是否有重叠, 代码执行是否有交错? ...所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果我创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的吗?
先说结论:LinkedBlockingQueue 的 stream 遍历的方式,在多线程下是有一定问题的,可能会出现死循环。 老有意思了,这篇文章带大家盘一盘。...点过去看一眼 JDK 8 的 tryAdvance 方法,果不其然,里面有一个 while 循环: 从 while 条件上看是 current 节点一直不是 null,所以跳不出这个循环。...h.next=h 也就是我前面画的这个图: 那么 dequeue 方法的这个地方和 tryAdvance 方法里面的 while 循环会发生一个什么样神奇的事情呢?...现在,我换一个问题问你:ConcurrentHashMap 是线程安全的吗? 我之前写过,这玩意在 JDK8 下也是有死循环的《震惊!...道理,就是这么一个道理。 最后,再说一次结论:LinkedBlockingQueue 的 stream 遍历的方式,在多线程下是有一定问题的,可能会出现死循环。 好了,那本文的技术部分就到这里啦。
B: new MyObject() A: 如果想创建另一个对象, 就再次new MyObject()? B: 是的 A: 所以说我们有某个类, 我们就可以对它实例化很多次?...这是个鸡和蛋的问题: 我可以使用MyClass里面的构造函数, 但是我无法实例化这个对象, 因为其他的类无法使用 "new MyClass()"....其他问题 上面巧克力锅炉那道题你可能写好了, 但是可能会出现这个问题: 锅炉可能在里面有液体的情况下又进行了fill填充动作. 这是怎么回事? 是不是其他线程引起的这个问题?...我们可能有两个线程都在执行这段代码: ? 那么两个线程调用时是否有重叠, 代码执行是否有交错? 请看下图: ?...所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果我创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的吗?
改进我们的小游戏 概有以下几个方面需要改进: 猜错的时候程序应该给点提示,例如告诉用户输入的值是大了还是小了。 每运行一次程序只能猜一次,应该提供多次机会给用户猜测。 每次运行程序,答案可以是随机的。...=左边不等于右边 Python的条件分支语法: if 条件 : 条件为真(True)执行的操作 else: 条件为假(False)执行的操作 while循环 第二个改进要求:程序应该提供多次机会给用户猜测...请用红笔圈出你认为需要进行循环的代码: print('------------------------------------') temp = input("不妨猜一下我现在心里想的是哪个数字:")...==8: temp=input("猜错了,请重新输入:") guess=int(temp) if guess == 8: print("我草,你是我心里的蛔虫吗?!") ...我们需要引入外援:random模块 这个random模块里边有一个函数叫做:randint(),Ta会返回一个随机的整数。 我们可以利用这个函数来改造我们的游戏!
gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。...作者注:近期的编译器会在内部检測栈溢出的可能,所以这样往栈里存储变量非常难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。...在程序结束后,全部这个程序分配的内存都会自己主动被处理掉。但假设上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题!...当输入“zebra”时,while循环会在运行前被终止,因此传给free()的变量就是传给malloc()的地址。...答:例如以下: int func(void *ptr) 假设这个函数的參数超过一个,那么这个函数应该由一个结构体来调用,这个结构体能够由须要传递參数来填充。 8.
领取专属 10元无门槛券
手把手带您无忧上云