摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 归并排序算法的使用情景 归并排序算法和快速排序算法是java.util.Arrays中使用的排序算。对于一般的基本数据类型,Arrays.sort函数使用双轴快速排序算法,而对于对象类 阅读全文
posted @ 2016-10-16 23:17 nullzx 阅读(13111) 评论(3) 推荐(7) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 单轴快速排序的基本原理 快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边,然后以当前中轴元素的位置为界,将左半部分子数组和右半... 阅读全文
posted @ 2016-09-18 00:49 nullzx 阅读(21237) 评论(6) 推荐(11) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. JDK环境的设置 一般情况下来说按照网上大多数的教程设置JDK的环境变量即可。但对于某些特殊的情况,比如实验室中安装了还原系统的计算机,上课时教室里供老师使用的计算机等等我们可能需要重复的操作。一般我将JDK放在U盘中,每次上课,开机后盘符可能发生变化,这样每次都设置一次环境变量... 阅读全文
posted @ 2016-08-27 12:46 nullzx 阅读(2761) 评论(0) 推荐(0) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 标准输入输出 标准输入、输出主要由缓冲区和操作方法两部分组。缓冲区实际上可以看做内存中的字符串数组,而操作方法主要是指printf、scanf、puts、gets,getcha、putcahr等操作缓冲区的方法。在C++以及Java等面向对象的编程语言中,将缓冲区以及操作缓... 阅读全文
posted @ 2016-06-19 18:47 nullzx 阅读(15899) 评论(0) 推荐(4) 编辑
摘要: continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环。在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使程序的结构紊乱,可读性变差。因此Java就发明了一种带标签的continue和break语句,实际上它是一种带限制的专门用于循环的goto语句。 通常情况下我们使用的... 阅读全文
posted @ 2016-06-16 10:12 nullzx 阅读(777) 评论(0) 推荐(0) 编辑
摘要: 1. CountDownLatch的介绍 CountDownLatch是一个同步工具,它主要用线程执行之间的协作。CountDownLatch 的作用和 Thread.join() 方法类似,让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。在直接创建线程的年代(Java 5.0 之前),我们可以使用 Thread.join()。在线程池出现后,因为线程池中的线程不能直接被引用,所以就必须使用... 阅读全文
posted @ 2016-03-13 19:11 nullzx 阅读(7909) 评论(0) 推荐(0) 编辑
摘要: 1. CyclicBarrier的介绍与源码分析 CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过 阅读全文
posted @ 2016-03-13 14:34 nullzx 阅读(10046) 评论(0) 推荐(0) 编辑
摘要: 简介: 在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏) 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用。假设停车场只有三个车位... 阅读全文
posted @ 2016-03-12 21:57 nullzx 阅读(13122) 评论(0) 推荐(1) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ScheduleExecutorService接口、ScheduledFuture接口 从图中可以看出ScheduledExecutorService接口继承了ExecutorSer 阅读全文
posted @ 2016-02-14 11:58 nullzx 阅读(12082) 评论(0) 推荐(2) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环。在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使程序的结构紊乱,可读性变差。因此Java就发明了一种带标签的continu... 阅读全文
posted @ 2016-02-08 13:29 nullzx 阅读(7254) 评论(0) 推荐(1) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ThreadPoolExecutor数据成员Private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING,0)); ctl主要用于存储线程池的工作状态以及池中正在运行的线程数。显然要在一个整型变量存... 阅读全文
posted @ 2016-02-06 16:16 nullzx 阅读(13455) 评论(4) 推荐(3) 编辑
摘要: 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 为什么要使用线程池? 我们现在考虑最简单的服务器工作模型:服务器每当接收到一个客户端请求时就创建一个线程为其服务。这种模式理论上可以工作的很好,但实际上会存在一些缺陷,服务器应用程序 阅读全文
posted @ 2016-02-01 15:58 nullzx 阅读(16166) 评论(0) 推荐(3) 编辑
摘要: 1. Callable、Future、RunnableFuture、FutureTask的继承关系 在多线程编程中,我们一般通过一个实现了Runnable接口的对象来创建一个线程,这个线程在内部会执行Runnable对象的run方法。如果说我们创建一个线程来完成某项工作,希望在完成以后该线程能够返回一个结果,但run方法的返回值是void类型,直接实现run方法并不可行,这时我们... 阅读全文
posted @ 2016-01-21 00:05 nullzx 阅读(2614) 评论(0) 推荐(1) 编辑
摘要: 1.特点 ReentrantLock能够实现共享资源的互斥访问,但是它在某些条件下效率比较低下。比如,多个线程要查询(或者说读取)某列车的余票数,如果使用ReentrantLock,那么多个线程的查询操作只能互斥,也就是说一个线程查询完成,下一个线程才能查询。考虑到读取操作并不会改变数据的值,如果能够并发的进行读取访问,既可以得到正确的结果也能提高效率。但是,当某个线程要进行购票或者退... 阅读全文
posted @ 2016-01-08 17:31 nullzx 阅读(683) 评论(0) 推荐(0) 编辑
摘要: 1. 重入锁的概念与作用 reentrant 锁意味着什么呢?简单来说,它有一个与获取锁相关的计数器,如果已占有锁的某个线程再次获取锁,那么lock方法中将计数器就加1后就会立刻返回。当释放锁时计数器减1,若计数器不为0,说明线程仍然占有锁;若计数器值为0,线程才会真正释放锁。 可重入锁可以避免同一个线程嵌套(或者说递归)获取锁时的死锁现象。 考虑下面这样一种... 阅读全文
posted @ 2015-12-25 23:28 nullzx 阅读(715) 评论(0) 推荐(0) 编辑
摘要: 1. 泛型类 class Gen { private T t; public T get(){ return t; } public void set(T argt){ t = argt; } } “”内的T为类型参数,只能是类名,不能是基本类型(如int , double),泛型类(以及后... 阅读全文
posted @ 2015-12-12 13:09 nullzx 阅读(2037) 评论(1) 推荐(0) 编辑
摘要: 1. Lock 的简介及使用 Lock是java 1.5中引入的线程同步工具,它主要用于多线程下共享资源的控制。本质上Lock仅仅是一个接口(位于源码包中的java\util\concurrent\locks中),它包含以下方法 //尝试获取锁,获取成功则返回,否则阻塞当前线程 void lock(); //尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常 v... 阅读全文
posted @ 2015-11-16 13:38 nullzx 阅读(10696) 评论(0) 推荐(1) 编辑
摘要: 1. 同步问题的提出 假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为1。 我们现在来分析原因,这里为了分析的简单,我们不考虑缓存的情况,实际上有缓存会使结果为1的可能性增大。A线程将内存中的变... 阅读全文
posted @ 2015-11-16 01:40 nullzx 阅读(4323) 评论(2) 推荐(5) 编辑