![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 78
yx0628
这个作者很懒,什么都没留下…
展开
-
Java多线程中Volatile的使用
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种转载 2014-05-28 11:41:10 · 747 阅读 · 0 评论 -
Java并发Concurrent包——Callable/Future/FutureTask解析
Runnable 接口,由于是 void 方法,是没有返回结果的,在并发包中,有 Callable 类,能够得到执行的结果。Callable返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。pub原创 2018-03-10 15:21:19 · 1061 阅读 · 0 评论 -
Java并发Concurrent包——ArrayBlockingQueue源码分析
ArrayBlockingQueue 是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。 BlockingQueue 接口实现的都是阻塞队列。而 ConcurrentLinkedQueue 是基于 CAS 和链表实现的无阻塞高性能队列。 ConcurrentLinkedQueue 的源码分析见 Java并发Concurrent包——ConcurrentLinked原创 2018-03-09 17:02:32 · 376 阅读 · 0 评论 -
Java并发Concurrent包——ConcurrentLinkedQueue源码分析
ConcurrentLinkedQueue 是并发中的高性能队列,而 BlockingQueue 接口下的是并发的阻塞队列。 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程原创 2018-03-09 16:00:04 · 245 阅读 · 0 评论 -
Java并发Concurrent包——CopyOnWriteArrayList源码分析
CopyOnWriteArrayList 和 ArrayList 比较相似,只不过 CopyOnWriteArrayList 是线程安全的。 当进行写操作时,将原来的数组复制一份新的数组,写操作在这个新数组上进行;此时不影响旧数组上的读操作。写操作完成后,数组的引用改为新的数组即可,旧数组不再使用。属性 // 锁对象 final transient ReentrantLock loc原创 2018-03-09 11:03:10 · 206 阅读 · 0 评论 -
Java并发Concurrent包的锁(七)——Semaphore源码分析及使用
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。Sync类 abstract static class Sync extends AbstractQueuedSynchronizer {原创 2018-03-08 16:38:37 · 187 阅读 · 0 评论 -
Java并发Concurrent包的锁(六)——CountDownLatch源码分析及使用
CountDownLatch 和 CyclicBarrier 比较相似,都属于并发的实用工具类。 CyclicBarrier 的源码分析和使用可以参考:Java并发Concurrent包的锁(五)——CyclicBarrier源码分析及使用JDK 文档中的定义: 用给定的计数初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法原创 2018-03-08 13:27:51 · 208 阅读 · 0 评论 -
Java并发Concurrent包的锁(五)——CyclicBarrier源码分析及使用
CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 CyclicBarrier 支持一个可选的 Runnable 命令,原创 2018-03-07 17:52:00 · 249 阅读 · 0 评论 -
Java中Volatile关键字详解
转载自 : Java中Volatile关键字详解–http://www.cnblogs.com/zhengbin/p/5654805.html基本概念先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对转载 2018-01-19 10:42:45 · 162 阅读 · 0 评论 -
Java中竞态条件和使用synchronized关键字同步
首先举一个例子: 定义一个 CountThread 类,如下,在 run 函数中进行全局变量的自增操作。public class CountThread extends Thread{ private int count = 0; @Override public void run() { count++; System.out原创 2018-01-17 16:37:26 · 346 阅读 · 0 评论 -
Java多线程中的死锁
Java多线程中的死锁,最简单的例子就是,线程 T1 持有对象 O1 的锁,然后去申请对象 O2 的锁;而线程 T2 持有对象 O2 的锁,然后去申请对象 O1 的锁。默认的锁申请操作都是阻塞的,这样就造成了线程互相持有对方的锁,造成死锁。复杂一些的情况可能会出现多个线程死锁的环路。 其根本原因是一个线程在持有一个锁 LOCK1 的时候,去申请另一个锁 LOCK2,即 LOCK1 没有释放,又去原创 2018-01-23 16:22:07 · 184 阅读 · 0 评论 -
Java中synchronized同步锁用法及作用范围
Java 中的 synchronized 关键字可以在多线程环境下用来作为线程安全的同步锁。本文主要对 synchronized 的作用,以及其有效范围进行讨论。 Java中的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的原创 2018-01-18 13:33:52 · 74821 阅读 · 12 评论 -
servlet线程安全问题——ThreadLocal模式
线程安全的概念范畴: 线程安全,指的是在多线程环境下,一个类在执行某个方法时,对类的内部实例变量的访问是安全的。如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。对于下面的两种变量,不存在任何线原创 2014-03-14 10:01:30 · 3996 阅读 · 2 评论 -
Java多线程中的wait/notify
关于对象锁:对象锁 - http://blog.csdn.net/yx0628/article/details/79086511 wait 方法在使用之前,必须先获得此对象的对象锁,所以必须在同步方法或者同步块中使用,执行 wait 方法后,当前线程释放该对象的锁。wait 返回之前,此线程需要和其他等待对象的线程竞争来获得锁,才能继续执行 wait 后的处理。 notify 方法也必须在同步原创 2018-01-22 10:45:59 · 196 阅读 · 0 评论 -
Java并发Concurrent包——ThreadPoolExecutor线程池源码分析
ThreadPoolExecutor 就是常用的线程池,下面通过其中重要的源码来分析:线程池的状态由下边的源码,可以得知,线程池由一个32位的 int 型来表示状态。其中高位的 3 位代表 5 种状态,低位的 29 位代表工作线程的数量。 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); pr原创 2018-03-11 18:21:32 · 278 阅读 · 0 评论