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