摘要: 两个整数相除 两个整数相除 将两个整数相除,要求不使用乘法、除法和 mod 运算符。如果溢出,返回 2147483647 。 (一)利用减法。超时 (二)一次一次加会超时,改进:每次将被除数增加1倍,同时将count也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作。。。但这个也会超时 阅读全文
posted @ 2016-11-02 10:57 Hesier 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 多线程除了同步问题外,还需要线程之间的协作。比如说最经典的生产者 消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生 阅读全文
posted @ 2016-10-04 10:37 Hesier 阅读(750) 评论(0) 推荐(0) 编辑
摘要: 创建线程有2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable 阅读全文
posted @ 2016-10-04 10:35 Hesier 阅读(418) 评论(0) 推荐(0) 编辑
摘要: ThreadPoolExecutor ThreadPoolExecutor继承了AbstractExecutorService类,并提供了四个构造器,事实上,通过观察每个构造器的源码具体实现,发现前面三个构造器都是调用的第四个构造器进行的初始化工作。 各个参数含义: corePoolSize:核心池 阅读全文
posted @ 2016-10-04 10:33 Hesier 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 对于多线程编程,java中有同步容器(HashTable,Vector),并发容器(ConcurrentHashMap、CopyOnWriteArrayList),还有阻塞队列。 非阻塞队列,比如PriorityQueue、LinkedList,一个很大问题就是:它不会对当前线程产生阻塞,那么在面对 阅读全文
posted @ 2016-10-04 09:06 Hesier 阅读(218) 评论(0) 推荐(0) 编辑
摘要: concurrent包下的并发容器 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5开始 阅读全文
posted @ 2016-10-03 21:14 Hesier 阅读(200) 评论(0) 推荐(0) 编辑
摘要: Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。 CopyOnWrite原理 CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加, 阅读全文
posted @ 2016-10-03 21:12 Hesier 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 同步容器 在Java中,同步容器主要包括2类: 1. Vector、Stack、HashTable。Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施。Stack也是一个同步容器,它的方 阅读全文
posted @ 2016-10-03 21:02 Hesier 阅读(837) 评论(0) 推荐(0) 编辑
摘要: 从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 synchronized的缺陷 如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁 阅读全文
posted @ 2016-10-03 20:56 Hesier 阅读(182) 评论(0) 推荐(0) 编辑
摘要: Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。 Java中的内存泄露与C++中的表现有所不同。在C++中,所有被分配了内存的对象,不再使用后,都必须程序员手动的释放他们。所以,每个类,都会含有一个析构函数,作用就是完成清理工作,如果我们忘记了某些对象的 阅读全文
posted @ 2016-10-02 14:51 Hesier 阅读(240) 评论(0) 推荐(0) 编辑