并发编程
文章平均质量分 67
Code_Seeker
悟已往之不谏,知来者之可追。
展开
-
fast-fail机制解析
-----原文出自:http://cmsblogs.com/?p=1220,请尊重作者辛勤劳动成果,转载说明出处.-----个人站点:http://cmsblogs在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证转载 2017-04-12 15:14:41 · 1264 阅读 · 0 评论 -
Java中的run()方法和start()的区别
一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程。但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别。start方法:通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。无需等待run()方法中的代码执行完毕,就可以接着执行...原创 2018-07-18 12:15:46 · 9937 阅读 · 0 评论 -
ConcurrentHashMap原理分析
曾经在 [高并发Java 五] JDK并发包1 中提到过ConcurrentHashMap,只是简单的提到了下ConcurrentHashMap的优点,以及大概的实现原理。而本文则重点介绍ConcurrentHashMap实现的细节。HashMap就不介绍了,具体请查看JDK7与JDK8中HashMap的实现HashTable是一个线程安全的类,它使用synchronized来锁住整张...转载 2018-07-25 09:36:15 · 214 阅读 · 0 评论 -
同步容器也并非线程安全
有一个问题:同步容器真的是安全的吗? 也有有人认为Vector中的方法都进行了同步处理,那么一定就是线程安全的,事实上这可不一定。看下面这段代码:public class Test { static Vector<Integer> vector = new Vector<Integer>(); public static void main(St...原创 2018-07-29 14:43:08 · 311 阅读 · 5 评论 -
Java并发编程:并发容器之CopyOnWriteArrayList
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机...转载 2018-07-29 15:23:29 · 207 阅读 · 0 评论 -
生产者消费者模式-(使用wait nofity机制实现和阻塞队列模式实现)
直接给出代码实现:import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumer { public int queueCapacity; public Queue<Integer> queue = new LinkedList<>(); Produ...原创 2018-07-29 17:22:02 · 465 阅读 · 0 评论 -
自己动手实现阻塞队列(基于Condition)
阻塞队列的实现其实就是基于等待通知机制,下面我们进行实现:import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;//我们自己来实现个阻塞队列,主要实现方法是size(),take(),put()即可publ...原创 2018-07-29 18:03:26 · 981 阅读 · 0 评论 -
sleep(),wait(),yield()和join()方法的区别
sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。 wait() wait()方法需要和notif...原创 2018-07-21 15:52:18 · 239 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore代码使用
一句话总结三者的区别:Semaphore用来限制资源的使用,比如连接池的Connection. CountDownLatch用于一个线程等待一些子任务完成的时候自己再执行,比如初始化,多个线程一起初始化,等子初始化都完成了,主线程进行处理,这里有主从线程的概念。而CyclicBarrier则没有主从线程的概念,它使得一组线程达到一个统一的状态,比如8个奥运会选手代表8个线程,让他们都走到起跑线的时...原创 2018-07-30 08:39:34 · 254 阅读 · 0 评论 -
ThreadPoolExecutor主要方法源码分析
线程池的源码及原理[JDK1.6实现]1.线程池的包含的内容2.线程池的数据结构【核心类ThreadPoolExecutor】: worker:工作类,一个worker代表启动了一个线程,它启动后会循环执行workQueue里面的所有任务workQueue:任务队列,用于存放待执行的任务keepAliveTime:线程活动保持时间,线程池的工作线程空闲后,保持存活的...原创 2018-08-03 23:16:54 · 248 阅读 · 0 评论 -
让线程的执行变得有序
线程如何有序执行。(1)使用共享变量的方式:代码如下利用原子递增控制线程准入顺序public class OrderedThread1 { static AtomicInteger count = new AtomicInteger(0); public static void main(String[] args) throws InterruptedException {...原创 2018-07-18 12:05:56 · 1332 阅读 · 1 评论 -
同步与异步,阻塞与非阻塞的关系
这几个知识点其实用处很多,也是很容易搞混的,我们平时可能用了但是并没有发现,今天想来总结一下。 我第一次感受到同步和异步的不同是在学习volatile的时候(因为我之前也没有多线程概念),之前也被同步啊这些概念搞的很乱。当我主线程新建了一个子线程之后两个线程是同时运行的,当时我才发现原来他们不是串行的,献丑了。好了进入正题。从总体来看,同步和异步的概念是大于阻塞与非阻塞,并且他们之间没有对应...原创 2018-07-18 11:57:36 · 353 阅读 · 0 评论 -
Copy-On-Write容器
聊聊并发-Java中的Copy-On-Write容器Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWri转载 2017-04-12 20:18:03 · 392 阅读 · 0 评论 -
BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而转载 2017-04-12 20:43:41 · 328 阅读 · 0 评论 -
Concurrent programming之性能和可伸缩性
1.资源:资源的含义很广,举几个例子:CPU时钟周期,内存,网络带宽,I/O带宽,数据库请求,磁盘空间等。 2.使用多线程会引入一些开销,包括:a.)线程之间的协调(加锁,触发信号以及内存同步)b.)增加的上下文切换c.)线程的创建和销毁d.)线程的调度 3.可伸缩性指的是:当增加计算资源的时候(内存、CPU、存储容量、I/O带宽),程序的吞吐量或者处理能力能...原创 2017-05-26 18:45:39 · 413 阅读 · 0 评论 -
Concurrent programming---死锁活锁和饥饿
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 死锁发生的条件· 互斥条件:线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到资源被释放。· 请求和保持条件:线程T1至少已经保持了一个...原创 2017-05-26 18:44:58 · 413 阅读 · 0 评论 -
Concurrent programming---避免活跃性危险
1.一些程序是包含死锁风险的,但是并不会立即显示出来,一般死锁发生在高负载的情况下。 2,死锁类别:a.)静态锁顺序死锁:如果两个线程试以不同的顺序获得相同的锁,就会产生锁顺序死锁。如果每个线程都以固定的顺序来获得锁,那么就就不会出现锁顺序死锁。 例子: private final Objectleft = new Object();private final O...原创 2017-05-26 18:43:43 · 421 阅读 · 0 评论 -
Concurrent programming---基础模块
1同步容器类的问题: 同步容器类包括Vector和Hashtable,这些类实现线程安全的方式是:把他们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态。 首先,同步容器类都是线程安全的,但是在某些情况下需要额外的客户端加锁来保护符合操作,例如迭代、跳转、以及条件运算。 比如有2个方法: public static Object...原创 2017-05-26 18:41:35 · 360 阅读 · 0 评论 -
Concurrent programming---对象的组合
1.在类中可能包含约束多个变量的不变性条件,此时这种不变性条件将带来原子性需求,这些相关的变量必须在单个原子操作中进行读取或更新。不能首先更新一个变量,然后再释放锁并再次获得锁然后再更新其他的变量。因为释放锁后,可能会使对象处于无效状态。结论:如果在一个不变性条件中包含多个变量,那么在执行任何访问相关变量的操作的时候,都必须持有保护这些变量的锁。 2.对于从构造函数或者从方...原创 2017-05-26 18:40:31 · 358 阅读 · 0 评论 -
Concurrent programming-对象的共享
1.同步另一个重要的方面:内存可见性。 2.结论:只要有数在多个线程之间共享,就使用正确的同步。 3.Java内存模型保证了简单的变量读取和写入操作都必须是原子操作,但对于非volatile类型的long和double变量,JVM将64位的读/写操作分解为两个32位的操作。如果变量的读操作和写操作在不同的线程中,那么很可能会读到某个值的高32位和另一个值的低32位置。j...原创 2017-05-26 18:39:18 · 384 阅读 · 0 评论 -
Concurrent programming---线程安全性
1.多个线程访问的可变变量,如果没有使用合适的同步,那么程序就会出现错误。请注意2个关键字:a.)多个线程。b.)可变变量。因此为了不出现错误,可以针对a.)不在线程之间共享该变量,针对b.)将该变量设置为不可变变量。c.)使用同步。 2.只有当类中仅包含自己的状态时(即不包含其他对象的状态),线程安全类采样才有意义。3.线程安全性:当多个线程访问某个类时,这个类始终都...原创 2017-05-26 18:37:34 · 478 阅读 · 0 评论 -
线程池主要属性分析
原文链接 http://blog.csdn.net/sd0902/article/details/8395677Java线程池使用说明一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程...原创 2018-08-04 10:12:36 · 2400 阅读 · 0 评论