
并发
文章平均质量分 62
talNot
这个作者很懒,什么都没留下…
展开
-
避免死锁的几种方法
1、避免一个线程同时获取多个锁; 2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。 3、尝试使用定时锁,使用Lock.tryLock(timeout)来替代使用内部锁机制。 4、对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。...原创 2018-08-14 14:52:11 · 12756 阅读 · 0 评论 -
Java中的13个原子操作类
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,属于4种类型的原子更 新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。 Atomic包里的类基本都...原创 2018-10-04 16:44:03 · 525 阅读 · 2 评论 -
Fork/Join框架
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干 个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 图片来自书籍 一、工作窃取(work-stealing)算法 工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。那么,为什么 需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,可以把这个任务分割为若...原创 2018-10-04 15:44:55 · 201 阅读 · 0 评论 -
Java中的阻塞队列
一、 1、 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是 从队列里取元素的线程。阻塞...原创 2018-10-04 14:37:35 · 183 阅读 · 0 评论 -
ConcurrentHashMap
一、产生原因 (1)线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。 (2)效率...原创 2018-10-03 14:41:47 · 219 阅读 · 0 评论 -
公平锁和非公平锁及读写锁
公平锁和非公平锁 一、如果一个锁是公平的,那么获取的顺序就应该符合请求的绝对顺序,即FIFO。 二、测试结果 非公平性锁可能使线程“饥饿”,为什么它又被设定成默认的实现呢?再次观察上表的结 果,如果把每次不同线程获取到锁定义为1次切换,公平性锁在测试中进行了10次切换,而非 公平性锁只有5次切换,这说明非公平性锁的开销更小。 三、,公平性锁保证了锁的获取按照FIFO原则,而代价是进行...原创 2018-10-03 10:53:28 · 2062 阅读 · 0 评论 -
Java中的lock接口
一、锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时 访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接 口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增 了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功 能,只是在使用时...原创 2018-10-02 17:30:36 · 389 阅读 · 0 评论 -
java中的-等待/通知机制
等待通知机制: 是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B 调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而 执行后续操作。上述两个线程通过对象O来完成交互,而对象上的wait()和notify/notifyAll()的 关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。 一、注意细节 ...原创 2018-10-01 18:20:54 · 426 阅读 · 0 评论 -
java中线程安全的集合
一、java . util . concurrent 包提供了映射 、 有序集和队列的高效实现 : ConcurrentHashMap 、 ConcurrentSkipListMap > ConcurrentSkipListSet 和 ConcurrentLinkedQueue。 这些集合使用复杂的算法, 通过允许并发地访问数据结构的不同部分来使竞争极小化 。 与大多数集合不同, size ...原创 2018-08-26 15:44:04 · 6791 阅读 · 0 评论 -
重排序及happens-before
JVM执行程序时,为提高性能,编译器和处理器会对指令做重排序,共三类 1、编译器优化的重排序。编译器在不改变担心阿诚程序语义的前提瞎,可以重新安排语句的执行顺序。 2、指令级别并行的重排序:现代处理器采用了指令机并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 3、内存系统的重排序:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能...原创 2018-08-19 12:03:51 · 289 阅读 · 0 评论 -
Volatile变量
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令 volatile定义:Java编程语言允许线程访问共享变量,为了 确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言 提供了volatile,在某些情况下比锁要更加方便。...原创 2018-08-12 12:53:55 · 214 阅读 · 0 评论 -
Synchronized
一、先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现 为以下3种形式。 对于普通同步方法,锁是当前实例对象。 ·对于静态同步方法,锁是当前类的Class对象。 ·对于同步方法块,锁是Synchonized括号里配置的对象。 二、synchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽 (Word)存储对...原创 2018-08-14 20:50:36 · 209 阅读 · 0 评论 -
提高volatile并发效率
一、著名的Java并发编程大师Doug lea在JDK 7的并发包里新增一个队列集合类Linked- TransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性 能。LinkedTransferQueue的代码如下。 /** 队列中的头部节点 */ private transient f?inal PaddedAtomicReference<...原创 2018-08-14 20:27:31 · 928 阅读 · 1 评论 -
线程池
一、优点 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理了如指掌。 二、处理流程 1)线程池判断...原创 2018-10-05 17:17:42 · 262 阅读 · 0 评论