![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发编程
吴二喵
拒绝拖延,拒绝熬夜,提高效率!
展开
-
sleep方法和wait方法的区别
一、两种的不同**来自不同的类:**wait方法是Object类的方法,sleep方法是Thread类的方法。对于锁的占用情况不同:最主要是sleep方法没有释放锁,而 wait 方法释放了锁,使得其他线程可以使用同步控制块或者方法。**使用范围:**wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用) synchronized原创 2016-05-14 15:56:45 · 1640 阅读 · 0 评论 -
同步工具类:CountDownLatch、CyclicBarrier和Semaphore
一、CountDownLatch用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。二、CyclicBarrier用法字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待转载 2016-09-17 23:28:54 · 325 阅读 · 0 评论 -
阻塞队列
一、几种不同的阻塞队列自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。 LinkedBlockingQu转载 2016-09-22 17:22:40 · 374 阅读 · 0 评论 -
I/O模型
一、什么是同步?什么是异步?同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行; 异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。例如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异转载 2016-09-18 14:42:54 · 220 阅读 · 0 评论 -
并发容器
同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。并发容器主要解决了两个问题: 根据具体场景进行设计,尽量避免synchronized,提供并发性。 定义了一些并发安全的复合操作转载 2016-09-17 22:59:10 · 404 阅读 · 0 评论 -
【转】HashMap源码解析
转自:http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html在看HashMap源码之前先复习一下数据结构。Java最基本的数据结构有数组和链表。数组的特点是空间连续(大小固定)、寻址迅速,但是插入和删除时需要移动元素,所以查询快,增加删除慢。链表恰好相反,可动态增加或减少空间以适应新增和删除元素,但查找时只能顺着一个个节点查找,所以转载 2016-05-15 09:42:39 · 265 阅读 · 0 评论 -
ArrayList、LinkedList、Vector的区别
这三者都实现了List 接口.所有使用方式也很相似,主要区别在于因为实现方式的不同,所以对不同的操作具有不同的效率。ArrayList 是一个可改变大小的数组。当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组。LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性转载 2016-09-09 14:18:13 · 202 阅读 · 0 评论 -
Collection接口和Collections类的区别
Collection接口和Collections类都在java.util包下,前者是接口,后者是类。 1、java.util.Collection是集合类的顶级接口。它提供对集合对象进行基本操作的通用接口方法。它的直接继承接口有List,Set和Queue. 2、java.util.Collections是一个包装类。此类完全由在 collection 上进行操作或返回 collection 的原创 2016-09-10 15:07:41 · 2606 阅读 · 0 评论 -
Thread类
一、线程的状态一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源,在前面的JVM内存区域划分一篇博文中知道程序计数器、Java栈、本转载 2016-09-17 21:11:11 · 373 阅读 · 0 评论 -
i++递增操作是否具有原子性
i++的操作不是原子的,因为它不会作为一个不可分割的操作来执行。它实际包含了三个独立的操作,读取i的值,将值加1,然后将计算结果写入i。这是一个读取—修改—写入的操作序列,并且其结果状态依赖于之前的状态。 volatile的语义不足以确保递增操作的原子性,除非你能确保只有一个线程对变量执行写操作。1、可以通过使用线程安全类,如 private final AtomicInterger i = ne原创 2016-09-14 17:23:04 · 2345 阅读 · 0 评论 -
java并发编程---线程池
线程池线程池,是指管理一组同构工作线程的资源池。线程池可以根据创建时选择的策略自动处理线程的生命周期。重点在于:在资源(如内存、CPU)充足的情况下,线程池没有明显的优势,否则没有线程池将导致服务器奔溃。一、为什么要用线程池如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程会消耗很多系统资源。那么有没有一种办法原创 2016-05-14 10:20:15 · 551 阅读 · 0 评论 -
Java中的锁
Java中的锁在Java5.0之前采用的锁机制是用synchronized。Java5.0增加了新的机制:ReentrantLock。与synchronized内置加锁不同,ReentrantLock是一种显示锁。一、内置锁synchronizedSynchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Syn原创 2016-05-14 21:02:58 · 1009 阅读 · 1 评论 -
Java并发编程--原子性和可见性
原子性竞态条件:当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。常见的竞态条件类型是先检查后执行操作,即通过一个可能失效的观测结果来决定下一步的动作。要避免竞态条件问题,就必须在某个线程修改该变量时,通过某种方式防止其他线程使用这个变量,从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是修改状态的过程中。在java.util.concurrent.atomic原创 2016-05-14 15:34:00 · 1510 阅读 · 0 评论 -
同步容器类
转载:http://www.cnblogs.com/dolphin0520/p/3933404.html 参考: 《Java并发编程实践》一、为什么会出现同步容器?像ArrayList、LinkedList、HashMap这些容器都是非线程安全的。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器转载 2016-05-26 14:40:36 · 252 阅读 · 0 评论 -
并发编程:Callable、Future、FutureTask
一、为什么会有Callable接口创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。转载 2016-09-22 22:25:21 · 321 阅读 · 0 评论